Objects

【前言】

JDK7里面新增的Objects类,该类的主要用途是将操作对象的一切常用操作进行的封装。包括hashCode、equals等。
本文是以java8版本介绍Objects类,所以也会介绍一下java8新增的方法。下面进入正题:


【简介】

/**
 * This class consists of {@code static} utility methods for operating
 * on objects.  These utilities include {@code null}-safe or {@code
 * null}-tolerant methods for computing the hash code of an object,
 * returning a string for an object, and comparing two objects.
 *
 * @since 1.7
 */
 大概翻译: 
     本类由一些操作对象的静态工具方法构成,这些工具方法包括了非空检查、方法的非空参数检查、
     比较对象的hashCode、为对象返回一个字符串表示、比较两个对象
  从j.7开始添加该类

【特点】

  • 该类是使用final修饰,不能被继承
  • 该类的构造方法被私有化(使用private修饰),不能直接创建对象
  • 该类中所有的方法都是静态方法,可以使用类型直接调用(对应2,该类不需要创建对象)

【源码截图】

Objects_第1张图片


【常用API】

//比较两个对象是否相等(首先比较内存地址,然后比较a.equals(b),只要符合其中之一返回true)
public static boolean equals(Object a, Object b);

//深度比较两个对象是否相等(首先比较内存地址,相同返回true;如果传入的是数组,则比较数组内的对应下标值是否相同)
public static boolean deepEquals(Object a, Object b);

//返回对象的hashCode,若传入的为null,返回0
public static int hashCode(Object o);

//返回传入可变参数的所有值的hashCode的总和(这里说总和有点牵强,具体参考Arrays.hashCode()方法)
public static int hash(Object... values);

//返回对象的String表示,若传入null,返回null字符串
public static String toString(Object o)

//返回对象的String表示,若传入null,返回默认值nullDefault
public static String toString(Object o, String nullDefault)

//使用指定的比较器c 比较参数a和参数b的大小(相等返回0,a大于b返回整数,a小于b返回负数)
public static <T> int compare(T a, T b, Comparator<? super T> c) 

//如果传入的obj为null抛出NullPointerException,否者返回obj
public static <T> T requireNonNull(T obj) 

//如果传入的obj为null抛出NullPointerException并可以指定错误信息message,否者返回obj
public static <T> T requireNonNull(T obj, String message)

-----------------------------以下是jdk8新增方法---------------------------

//判断传入的obj是否为null,是返回true,否者返回false
public static boolean isNull(Object obj)

//判断传入的obj是否不为null,不为空返回true,为空返回false (和isNull()方法相反)
public static boolean nonNull(Object obj)

//如果传入的obj为null抛出NullPointerException并且使用参数messageSupplier指定错误信息,否者返回obj
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)

【案例】

下面简单测试了几个方法:

package cn.demo;

import org.junit.Test;

import java.util.Comparator;
import java.util.Objects;

public class ObjectsTest {

    /**
     *  因为Objects类比较简单,所以只用这一个测试用例进行测试
     * */
    @Test
    public void equalsTest(){
        String str1 = "hello";
        String str2 = "hello";
        
        // 比较对象是否是同一对象
        // Objects.equals(str1, str2) ?  true
        boolean equals = Objects.equals(str1, str2);
        System.out.println("Objects.equals(str1, str2) ?  "+ equals);
    }
    
    @Test
    public void deepEqualsTest(){
        String str1 = "hello";
        String str2 = "hello";
        
        // 比较对象是否是同一对象
        boolean deepEquals = Objects.deepEquals(str1, str2);
        //Objects.deepEquals(str1, str2) ?  true
        System.out.println("Objects.deepEquals(str1, str2) ?  "+ deepEquals);
        
        int[] arr1 = {1,2};
        int[] arr2 = {1,2};
        // 比较数组是否是同一数组
        deepEquals = Objects.deepEquals(arr1, arr2);
        //Objects.deepEquals(arr1, arr2) ?  true
        System.out.println("Objects.deepEquals(arr1, arr2) ?  "+ deepEquals);
    }
    
    @Test
    public void hashCodeTest(){
        String str1 = "hello";

        // 获取hashCode 值
        int hashCode = Objects.hashCode(str1);
        //Objects.hashCode(str1) ?  99162322
        System.out.println("Objects.hashCode(str1) ?  "+ hashCode);

        // 获取null的hashCode 值
        hashCode = Objects.hashCode(null);
        //Objects.hashCode(null) ?  0
        System.out.println("Objects.hashCode(null) ?  "+ hashCode);
    }

    @Test
    public void hashTest(){
        int  a  = 100;

        // 获取hashCode 值
        int hashCode = Objects.hashCode(a);
        //Objects.hashCode(str1) ?  100
        System.out.println("Objects.hashCode(str1) ?  "+ hashCode);

        // 获取hashCode 值
        int[] arr = {100,100};
        hashCode = Objects.hash(arr);
        //Objects.hashCode(arr) ?  1555093793
        System.out.println("Objects.hashCode(arr) ?  "+ hashCode);
    }

    @Test
    public void compareTest(){
        int a = 10;
        int b = 11;

		// 比较对象
        int compare = Objects.compare(a, b, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        
        // compare = -1
        System.out.println(" compare = "+ compare);
    }

    @Test
    public void requireNonNullTest(){
        String test = null;
        // java.lang.NullPointerException
       //  String s = Objects.requireNonNull(test);

        // java.lang.NullPointerException: 这是空指针异常提示的信息
        // String s = Objects.requireNonNull(test, "这是空指针异常提示的信息");


        // java.lang.NullPointerException: 我是返回的异常信息
        String s = Objects.requireNonNull(test,()->"我是返回的异常信息");
    }
}

【总结】

Objects类给我们提供了一些常用的操作对象的方法,我们可以直接使用,这是非常方便的。尤其是requireNonNull()方法,在我们写方法时需要判断传入的参数是否为null可以使用该方法及其方便。

你可能感兴趣的:(常用工具类)