java.util.Objects 类
包含了几个静态方法,可以实现对对象的比较、生成hash code之类的功能,
很多方法里考虑了对象是null的情况,在输入的参数是null时有特定的处理方式。
以下是该类中包含的方法:
public static <T> int compare(T a, T b, Comparator<? super T> c)
比较对象a和对象b,如果a和b是相等的,返回0,如果不相等,调用c的compare方法。
注意:如果a或者b是null的情况下,调用c的compare方法时有可能报空指针异常,看c的compare方法怎么写了。
public static boolean equals(Object a, Object b)
比较对象a和对象b,使用的是第一个参数的equals()方法,
如果两个参数中有一个是null,则返回false,
如果两个参数都是null,则返回true。
public static boolean deepEquals(Object a, Object b)
比较对象a和对象b是否深度相等,使用的其实是Arrays.deepEquals()方法
只有a和b对应位置的元素都相等时,才返回true,a好b都是null也返回true,否则返回false。
public static int hash(Object... values)
得到一列对象的hash code,
使用的其实是Arrays.hashCode(Object[]),Object[]数组元素就是hash方法传入的参数值
public static int hashCode(Object o)
得到一个对象的hash code,如果参数为null,返回0
public static <T> T requireNonNull(T obj)
判断一个对象是不是null,如果不是null则返回对象本身,如果是null则抛出空指针异常。
public static <T> T requireNonNull(T obj,String message)
判断一个对象是不是null,如果不是null则返回对象本身,如果是null则抛出空指针异常,并把第二个参数message写在异常信息中
public static String toString(Object o)
调用对象的toString()方法,如果参数是null,返回字符串"null"
public static String toString(Object o, String nullDefault)
调用对象的toString()方法,如果参数是null,返回第二个参数表示的字符串
相关的测试代码如下:
package test; import java.util.Arrays; import java.util.Comparator; import java.util.Objects; public class Test { /** * 自定义的Comparator实现类 * */ public static class Comp implements Comparator<Test>{ /** * 如果t1的age大,返回1,否则返回2 */ @Override public int compare(Test t1, Test t2) { if(t1.age>t2.age){ return 1; }else { return 2; } } } public int age; public static void main(String[] args) { testCompare(); testEquals(); testDeepEquals(); testHash(); testHashCode(); testRequireNonNull(); testRequireNonNullMessage(); testToString(); testToStringDefault(); } public static void testCompare(){ Comp c=new Comp(); Test a=new Test(); a.age=123; Test b=new Test(); b.age=123; int result=Objects.compare(a, a, c); System.out.println(result);//a和a完全是同一个对象,直接返回0 int result2=Objects.compare(a, b, c); System.out.println(result2);//a和b不是一个对象,所以调用c的compare方法,返回1 } public static void testEquals(){ Test a=new Test(); a.age=123; Test b=new Test(); b.age=123; boolean result=Objects.equals(a, b); System.out.println(result);//返回false boolean result2=Objects.equals(null, b); System.out.println(result2);//返回false boolean result3=Objects.equals(null, null); System.out.println(result3);//返回true } public static void testDeepEquals(){ String[] a=new String[]{"123","456","789"}; String[] b=new String[]{"123","456","789"}; boolean result=a.equals(b); System.out.println(result);//返回false boolean result2=Objects.deepEquals(a, b); System.out.println(result2);//返回true boolean result3=Objects.deepEquals(null, b); System.out.println(result3);//返回false boolean result4=Objects.deepEquals(null, null); System.out.println(result4);//返回true } public static void testHash(){ String a="123"; String b="23"; String c="3"; System.out.println(a.hashCode());//48690 System.out.println(b.hashCode());//1601 System.out.println(c.hashCode());//51 System.out.println(Objects.hash(a));//48721,不等于a.hashCode() String[] arr=new String[]{"123","23","3"}; System.out.println(Arrays.hashCode(arr));//46870563 System.out.println(Objects.hash(a,b,c));//46870563,等于Arrays.hashCode(arr) } public static void testHashCode(){ System.out.println(Objects.hashCode("123"));//48690 System.out.println("123".hashCode());//48690 System.out.println(Objects.hashCode(null));//0 } public static void testRequireNonNull(){ Test t1=new Test(); t1.age=123; Test t2=Objects.requireNonNull(t1); System.out.println(t2.age);//t1不是null,于是赋值给了t2,age和t1一样是123 Test t3=Objects.requireNonNull(null); System.out.println(t3.age);//t3是null,抛出空指针异常 } public static void testRequireNonNullMessage(){ Test t1=new Test(); t1.age=123; Test t2=Objects.requireNonNull(t1,"参数不能是null"); System.out.println(t2.age);//t1不是null,于是赋值给了t2,age和t1一样是123 Test t3=Objects.requireNonNull(null,"参数不能是null"); System.out.println(t3.age);//t3是null,抛出空指针异常 /* * 异常的内容是这样的: * Exception in thread "main" java.lang.NullPointerException: 参数不能是null at java.util.Objects.requireNonNull(Unknown Source) at test.Test.testRequireNonNullMessage(Test.java:126) at test.Test.main(Test.java:36) */ } public static void testToString(){ String a="123"; System.out.println(Objects.toString(a));//返回123 System.out.println(Objects.toString(null));//返回字符串"null" } public static void testToStringDefault(){ String a="123"; System.out.println(Objects.toString(a,"default string"));//返回123 System.out.println(Objects.toString(null,"default string"));//返回字符串"default string" } }