Java中如何使用Objects类
Java中如何使用Objects类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1 Objects
1.1 Objects方法
工具类,常用于检查操作
返回值 | 方法名 | 作用 |
---|---|---|
static int | checkFromIndexSize(int fromIndex, int size, int length) | 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。 |
static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内 |
static int | checkIndex(int index, int length) | 检查子范围index是否在 [0,length)范围界限内 |
static int | compare(T a, T b, Comparator<? super T> c) | 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果 |
static boolean | deepEquals(Object a, Object b) | 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数) |
static boolean | equals(Object a, Object b) | 对比a,b参数是否相等 |
static int | hash(Object… values) | 为输入值序列生成哈希码 |
static int | hashCode(Object o) | 非空返回哈希码,null则抛出NullPointerException |
static boolean | isNull(Object obj) | obj参数为null返回true |
static boolean | nonNull(Object obj) | obj参数不为null返回true |
static T | requireNonNull(T obj) | 检查指定的对象引用不是 null,为null则抛出NullPointerException |
static T | requireNonNull(T obj, String message) | 检查指定的对象引用不是null,否则抛出自定义的NullPointerException |
static T | requireNonNull(T obj, Supplier messageSupplier) | 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。 |
static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。 |
static String | toString(Object o) | 返回对象的字符串表示形式 |
static String | toString(Object o, String nullDefault) | 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数 |
1.2 Objects常用方法
1.2.1 equals(Object a, Object b)
equals(Object a, Object b)源码:public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}
1.2.2 isNull(Object obj)
isNull(Object obj)源码:public static boolean isNull(Object obj) {return obj == null;}
1.2.3 nonNull(Object obj)
nonNull(Object obj)源码:public static boolean nonNull(Object obj) {return obj != null;}
1.2.4 requireNonNull(T obj)
requireNonNull(T obj)源码:public static T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;}
1.3 Objects源码
packagejava.util; importjdk.internal.util.Preconditions; importjdk.internal.vm.annotation.ForceInline; importjava.util.function.Supplier; publicfinalclassObjects{ privateObjects(){ thrownewAssertionError("Nojava.util.Objectsinstancesforyou!"); } publicstaticbooleanequals(Objecta,Objectb){ return(a==b)||(a!=null&&a.equals(b)); } publicstaticbooleandeepEquals(Objecta,Objectb){ if(a==b) returntrue; elseif(a==null||b==null) returnfalse; else returnArrays.deepEquals0(a,b); } publicstaticinthashCode(Objecto){ returno!=null?o.hashCode():0; } publicstaticinthash(Object...values){ returnArrays.hashCode(values); } publicstaticStringtoString(Objecto){ returnString.valueOf(o); } publicstaticStringtoString(Objecto,StringnullDefault){ return(o!=null)?o.toString():nullDefault; } publicstatic<T>intcompare(Ta,Tb,Comparator<?superT>c){ return(a==b)?0:c.compare(a,b); } publicstatic<T>TrequireNonNull(Tobj){ if(obj==null) thrownewNullPointerException(); returnobj; } publicstatic<T>TrequireNonNull(Tobj,Stringmessage){ if(obj==null) thrownewNullPointerException(message); returnobj; } publicstaticbooleanisNull(Objectobj){ returnobj==null; } publicstaticbooleannonNull(Objectobj){ returnobj!=null; } publicstatic<T>TrequireNonNullElse(Tobj,TdefaultObj){ return(obj!=null)?obj:requireNonNull(defaultObj,"defaultObj"); } publicstatic<T>TrequireNonNullElseGet(Tobj,Supplier<?extendsT>supplier){ return(obj!=null)?obj :requireNonNull(requireNonNull(supplier,"supplier").get(),"supplier.get()"); } publicstatic<T>TrequireNonNull(Tobj,Supplier<String>messageSupplier){ if(obj==null) thrownewNullPointerException(messageSupplier==null? null:messageSupplier.get()); returnobj; } @ForceInline publicstatic intcheckIndex(intindex,intlength){ returnPreconditions.checkIndex(index,length,null); } publicstaticintcheckFromToIndex(intfromIndex,inttoIndex,intlength){ returnPreconditions.checkFromToIndex(fromIndex,toIndex,length,null); } publicstaticintcheckFromIndexSize(intfromIndex,intsize,intlength){ returnPreconditions.checkFromIndexSize(fromIndex,size,length,null); } }
2 区别于Object
2.1 Object构造方法
public Object()
Object类是基类,是所有类的父类(基类)
如果一个类没有明确的继承某一个具体的类,则将默认继承Object类
例如我们定义一个类:
public class Person{}其实它被使用时 是这样的:public class Person extends Object{}
object的多态:使用Object可以接收任意的引用数据类型
例:
publicstaticvoidmain(String[]args){ Stringtext="123"; say(text); inta=10; say(a); say("123"); } publicstaticvoidsay(Objecto){//多态的体现 System.out.println(o); }
2.2 Object其他方法
返回值 | 方法名 | 作用 |
---|---|---|
static int | checkFromIndexSize(int fromIndex, int size, int length) | 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。 |
static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内 |
static int | checkIndex(int index, int length) | 检查子范围index是否在 [0,length)范围界限内 |
static int | compare(T a, T b, Comparator<? super T> c) | 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果 |
static boolean | deepEquals(Object a, Object b) | 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数) |
static boolean | equals(Object a, Object b) | 对比a,b参数是否相等 |
static int | hash(Object… values) | 为输入值序列生成哈希码 |
static int | hashCode(Object o) | 非空返回哈希码,null则抛出NullPointerException |
static boolean | isNull(Object obj) | obj参数为null返回true |
static boolean | nonNull(Object obj) | obj参数不为null返回true |
static T | requireNonNull(T obj) | 检查指定的对象引用不是 null,为null则抛出NullPointerException |
static T | requireNonNull(T obj, String message) | 检查指定的对象引用不是null,否则抛出自定义的NullPointerException |
static T | requireNonNull(T obj, Supplier messageSupplier) | 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。 |
static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。 |
static String | toString(Object o) | 返回对象的字符串表示形式 |
static String | toString(Object o, String nullDefault) | 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数 |
2.2.1 equals(Object obj)
equals(Object obj)源码:public boolean equals(Object obj) {return (this == obj);}
equals方法在非null对象引用上实现等价关系
等于
对于任何非空引用值x和y,当且仅当x和y引用同一对象( x == y具有值true )时,此方法返回true
==比的是内存地址
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。
publicstaticvoidmain(String[]args){ Personp=newPerson(1234,"张三"); Persone=newPerson(2345,"李四"); System.out.println("p:"+p.hashCode());//p:1239731077 System.out.println("e:"+e.hashCode());//e:357863579 System.out.println(p.equals(e));//false e=p;//此时指向相同的内存地址 System.out.println("e:"+e.hashCode());//e:1239731077 System.out.println(p.equals(e));//true }
输出结果:p:1239731077e:357863579falsee:1239731077true
equals方法重写时的五个特性:
自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)返回true 。传递性 :对于任何非空引用值x ,y和z ,如果x.equals(y)回报true并且y.equals(z)返回true,x.equals(z)应该返回true 。一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,前提是未修改对象上的equals比较中使用的信息。非空性 :对于任何非空的参考值x , x.equals(null)应该返回false 。
2.2.2 toString()
toString()源码public String toString() {return getClass().getName() + “@” + Integer.toHexString(hashCode());}
默认为字符串,通常返回一个“文本表示”此对象的字符串,返回对象的内存地址(对象实例的类名称@对象的哈希码的无符号十六进制,即:getClass().getName() + ‘@' + Integer.toHexString(hashCode()))
publicstaticvoidmain(String[]args){ Personp=newPerson(1234,"张三"); Persone=newPerson(2345,"李四"); System.out.println("e.getClass():"+e.getClass()); System.out.println("e.hashCode():"+e.hashCode()); System.out.println("e.toString():"+e.toString()); }
输出结果:e.getClass():class com.company.demo.Persone.hashCode():114132791e.toString():com.company.demo.Person@6cd8737
建议重写Object中的toString方法
2.3 Object源码
packagejava.lang; importjdk.internal.HotSpotIntrinsicCandidate; publicclassObject{ privatestaticnativevoidregisterNatives(); static{ registerNatives(); } @HotSpotIntrinsicCandidate publicObject(){} @HotSpotIntrinsicCandidate publicfinalnativeClass<?>getClass(); @HotSpotIntrinsicCandidate publicnativeinthashCode(); publicbooleanequals(Objectobj){ return(this==obj); } @HotSpotIntrinsicCandidate protectednativeObjectclone()throwsCloneNotSupportedException; publicStringtoString(){ returngetClass().getName()+"@"+Integer.toHexString(hashCode()); } @HotSpotIntrinsicCandidate publicfinalnativevoidnotify(); @HotSpotIntrinsicCandidate publicfinalnativevoidnotifyAll(); publicfinalvoidwait()throwsInterruptedException{ wait(0L); } publicfinalnativevoidwait(longtimeoutMillis)throwsInterruptedException; publicfinalvoidwait(longtimeoutMillis,intnanos)throwsInterruptedException{ if(timeoutMillis<0){ thrownewIllegalArgumentException("timeoutMillisvalueisnegative"); } if(nanos<0||nanos>999999){ thrownewIllegalArgumentException( "nanosecondtimeoutvalueoutofrange"); } if(nanos>0){ timeoutMillis++; } wait(timeoutMillis); } protectedvoidfinalize()throwsThrowable{} }
看完上述内容,你们掌握Java中如何使用Objects类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注恰卡编程网行业资讯频道,感谢各位的阅读!