Java中原生工具类Objects的使用说明书

前言

Java语言在开发初期对Java的一些相关的工具类的支持做的非常差,这直接导致了开发者在日常开发中大大部分工具类都会采用第三方的来进行使用,这样会出现一个问题就是每一个项目都会有一套自己的工具类,甚至一个项目中里面会有很多套工具类出现,这样不但会使我们的项目非常混乱,同时也会由于依赖了很多无用的jar包,造成我们真个项目打出来的 Jar 包巨大无比。随着Java语言的不断发展,Java官方也在逐渐的对这方面进行了重视,也在原生JDK中不断加入一些常用的工具类来方便开发者日常的使用,下面我们要说到的这个类就是Jdk1.7才新增的一个操作Object的工具类,它的名字叫Objects,名字非常相似,但是功能差异却非常大,接下来我们就来了解一下这个非常新的类 Objects,帮助我们在日常开发中可以更好的使用它。

方法列表

在学习之前,我们先把这个类的这些方法来整体看一下

在这里插入图片描述

上面的就是Objects类的全部方法列表,这个类是从Jdk1.7新增的,但是里面的很多方法是从Jdk1.8才新增的,里面的很多方法也是我们平常会经常用到的,比如说对于一个对象null的判断,下面我们就深入源码,来看看这些方法的实现方式。

源码分析

public final class Objects {
    //Objects类的唯一构造方法是私有的,如果采用一些非通用渠道来新建这个类的话会抛出 AssertionError 错误
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }

    //比较两个对象是否相等,如果是基本数据类型则通过==来进行比较,使用该方法进行比较可以避免出现空指针异常
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

   //比较两个对象是否相等,deepEquals 和 equals 最大的区别是 deepEquals 支持了对于数组对象的比较
    public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }

    //生成一个对象的hashCode,如果是null的话,hashCode为0
    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }

   
    
    //计算一个对象数组的hash值
    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

     
    //将对象转换为字符串,如果是null的话返回“null” 
    public static String toString(Object o) {
        return String.valueOf(o);
    }

   
     
    //将对象转换为字符串,如果是null的话返回自定义字符串 
    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }

    
    //比较两个传入对象的大小,如果相等则返回0,大于或者小于具体返回通过 Comparator 来确定
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }

    //判断传入对象是否为null,如果不为null则返回原对象,如果是null的话抛出 NullPointerException 异常
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

    //判断传入对象是否为null,如果不为null则返回原对象,如果是null的话抛出提示自定义的 NullPointerException 异常
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }

    
    //判断传入对象是否为null,不等于null返回false;等于null返回true;从JDK1.8才开始新增的  
    public static boolean isNull(Object obj) {
        return obj == null;
    }

    
    //判断传入对象是否为null,不等于null返回true;等于null返回false;从JDK1.8才开始新增的 
    public static boolean nonNull(Object obj) {
        return obj != null;
    }

    //判断传入对象是否为null,如果不为null则返回原对象,如果是null的话抛出提示自定义的 NullPointerException 异常
    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier.get());
        return obj;
    }

使用实例

public class ObjectsTests {
  public static void main(String[] args) {
    System.out.println("null hashCode : " + Objects.hash(null));
    System.out.println("123 hashCode : " + Objects.hash(123));
    System.out.println("123 456 hashCode : " + Objects.hash(123,456));


    List<Integer> listOne = Arrays.asList(1, 2, 3);

    List<Integer> listTwo = Arrays.asList(1, 2, 3);
    //equals
    System.out.println(" listOne equals listTwo " + Objects.equals(listOne, listTwo));

    //deepEquals
    System.out.println(" listOne deepEquals listTwo " + Objects.deepEquals(listOne, listTwo));
    listTwo.set(1, 3);
    listTwo.set(2, 2);

    System.out.println(" listOne equals listTwo " + Objects.equals(listOne, listTwo));

    System.out.println(" listOne deepEquals listTwo " + Objects.deepEquals(listOne, listTwo));

    String[] strArrayOne = {"aa", "bb", "cc"};
    String[] strArrayTwo = {"aa", "bb", "cc"};

    //equals
    System.out.println(" strArrayOne equals strArrayTwo " + Objects.equals(strArrayOne, strArrayTwo));

    //deepEquals
    System.out.println(" strArrayOne deepEquals strArrayTwo " + Objects.deepEquals(strArrayOne, strArrayTwo));

    System.out.println("对 null 进行ToString: " + Objects.toString(null));

    System.out.println("对 null 进行ToString: " + Objects.toString(null, "这是null"));

    System.out.println("对 null 进行ToString: " + Objects.toString(null, null));

    System.out.println("is null : " + Objects.isNull(null));


  }

}


运行结果:

null hashCode : 0
123 hashCode : 154
123 456 hashCode : 5230
 listOne equals listTwo true
 listOne deepEquals listTwo true
 listOne equals listTwo false
 listOne deepEquals listTwo false
 strArrayOne equals strArrayTwo false
 strArrayOne deepEquals strArrayTwo true
对 null 进行ToString: null
对 null 进行ToString: 这是null
对 null 进行ToString: null
is null : true

总结

通过上面的源码解释和使用实例的展示,我们现在已经已经非常清楚这些方法的作用和使用场景啦,在今后的开发中,如果碰到这些针对对象的处理就可以直接通过这些原生的方法来处理啦。

猜你喜欢

转载自blog.csdn.net/zhangzehai2234/article/details/106063074