java.util.Objects 类
包含了几个静态方法,可以实现对对象的比较、生成hash code之类的功能,
很多方法里考虑了对象是null的情况,在输入的参数是null时有特定的处理方式。
比较对象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)
包含了几个静态方法,可以实现对对象的比较、生成hash code之类的功能,
很多方法里考虑了对象是null的情况,在输入的参数是null时有特定的处理方式。
以下是该类中包含的方法:
比较对象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"
}
}
和题目不相关的吐槽:
这玩意也好意思腆着脸叫中文版