从头开始学JDK-------Objects

目录

* 前言

* Objects #equals

* Objects #deepEquals

* Objects #hashCode

* Objects #hash(Object ....)

* Objects #toString(String)

* Objects #toString(String,String)

* Objects #requiredNonNull(T):T

* Objects #空相关


* 前言

        最早听说Objects类是在公司的CodeReview会议上,有一位高级工程师给我提的优化代码意见。当时我使用equals方法的时候,使用的是Object#equals方法,但是这个方法的缺点是每次调用之前,都要防止调用对象空指针异常。Objects类在java.util包下,所以定位为工具类。该类源代码篇幅不长,但却十分常用。从该类中可以学到很多,例如如何封装方法,如何避免空指针类的BUG。

* Objects #equals

        如果两个对象都是null,返回true。否则调用Object#equals方法。

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

* Objects #deepEquals

        在Objects#equals基础上,增加了数组对比的功能。

        如果是非数组,调用Objects#equals方法;如果是数组,依次遍历数组中的元素,调用元素的equals方法。

    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);
    }

* Objects #hashCode

        空对象的hashcode是0,避免调用对象是出现空指针异常。

    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }

* Objects #hash(Object ....)

         调用每个元素的hash值,然后用31作为乘子累计计算。为什么用31作为乘子,因为31算出来的值不大不小,可以减低hash冲突。

    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

* Objects #toString(String)

        这个方法相当于把Object#toString方法的调用者提取出来,放到静态方法中。

        如果是调用者是null,返回字符串"null"

clsas Object ...
    public static String toString(Object o) {
        return String.valueOf(o);
    }

class String ...
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

* Objects #toString(String,String)

        当调用者是null的时候,返回一个个默认值。

    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }

* Objects #requiredNonNull(T):T

        传进来的对象是空则抛异常。

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

   public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }

* Objects #空相关

    public static boolean isNull(Object obj) {
        return obj == null;
    }

    public static boolean nonNull(Object obj) {
        return obj != null;
    }

 

posted @ 2022-07-17 12:13  小大宇  阅读(3)  评论(0编辑  收藏  举报