lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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"
	}
}

  

posted on 2021-07-08 11:45  白露~  阅读(251)  评论(0编辑  收藏  举报