JDK8源码阅读(二) java.util.Objects

一、类

1.1 类修饰符

A. 该类为final类型;

B. 该类由一些静态的方法组成, 包含一些安全的非空操作或空操作或哈希值或比较俩个对象等的一些操作方法。

 

1.2 类结构图

 

二、字段

1.1 字段列表

无。

 

三、方法

3.1 方法列表

注:如上图,共有24个方法。 

        绿色打开的锁代表是public,  红色关闭的代表是private, 灰色的钥匙代表的protected。带下划线的是父类Object中的方法。

3.2 方法修饰符


3.3 方法详解

3.3.0 [静态]代码块

无。

 

3.3.1 构造函数

A. 是一个私有的构造函数,禁止实例化,否则会抛出一个断言异常; 

 

3.3.2 equals(Object a, Object b)

A. 如果俩个对象都是null,则返回true; 如果只有一个为null, 则返回false;

B. 如果俩个都不为null, 则通过Object类的equals方法来判断。 

 

3.3.3 deepEquals(Object a, Object b)

A. 如果俩个对象地址相同或者都为空,则返回true;  如果有一个为空,则返回false;

B. 否则调用Java.util.Arrays工具类的deepEquals0方法进行比较。该方法内部操作大致如下:如果俩个对象都是数组并且元素也是数组时,则调用Java.util.Arrays工具类的deepEquals方法进行比较,这里面包含了一个类似递归的判断用于不断处理元素是数组的情况;如果俩个对象都是数组并且数组类型一样但是元素不再是数组,则遍历依次比较, 否则,调用java.util.Object类的equals方法进行比较。如下图:

 

3.3.4 hashCode(Object o)

A. 返回对象的哈希码。如果对象为空,则返回0, 否则返回java.util.Object类中的hashCode方法计算出的哈希值;

 

3.3.5 hash(Object... values)

A. 通过调用java.util.Arrays类的hashCode方法为一个数组生成一个哈希值。注意:该方式计算得到的哈希值和调用java.util.Object的哈希值不一样。该hashCode(Object[] a)的内部操作大致如下:如果数组为空,则返回0;否则根据数组内的每一个元素计算一次哈希值返回。如下图:

B. 该方法对于有多个字段的对象实现哈希值很有用,例如: 一个对象有三个字段x,y,z, 则可以通过如下方式获取对象的哈希值:

 

3.3.6 toString(Object o)

A. 调用java.lang.String类的valueOf方法返回一个对象的字符串表示。

B. String类的valueOf方法内部操作大致如下:如果对象为空,则返回一个“null”字符串,否则,返回该对象调用java.lang.Object类的toString()方法得到的字符串,即 类的全限定名 + @ + 16进制码。具体如下:

 

3.3.7 toString(Object o, String nullDefault)

A. 如果对象不为空,则返回该对象的toString方法值,否则,返回默认的第二个参数值。

 

3.3.8 compare(T a, T b, Comparator<? super T> c)

A. 使用指定的比较器比较俩个对象。

B. 如果俩个对象相同(比如都为null),则返回0;如果不相同,则返回比较器比较得出的结果。

C. 如果比较的对象有一个为null, 则有可能抛出空指针异常,具体是否会抛出需要根据比较策略来判断。

 

3.3.9 requireNonNull(T obj)

A. 此方法主要用于在方法和构造函数中进行参数验证,如果对象为空,则抛出一个空指针异常,否则,返回该对象。使用方式如下图:

 

3.3.10 requireNonNull(T obj, String message)

A.   此方法主要用于在方法和构造函数中进行参数验证,如果对象为空,则抛出一个自定义提示信息的空指针异常,否则,返回该对象。使用方式如下图:

 

3.3.11 isNull(Object obj)

A. 判断对象是否为空,如果为空,则返回true, 否则返回false。

 

3.1.12 nonNull(Object obj)

A. 判断对象是否为非空,如果非空,则返回true, 否则返回false。

 

3.1.13 requireNonNull(T obj, Supplier<String> messageSupplier)

A.  此方法主要用于在方法和构造函数中进行参数验证,如果对象为空,则抛出一个自定义的空指针异常,否则,返回一个由Supplier接口get方法得到的对象。

B. 该方法与3.3.10 requireNonNull(T obj, String message)方法相似,不过此方法允许将消息的创建延迟到进行空检查之后。在非空情况下,这可能会带来性能优势,但在决定调用此方法时,应注意创建消息供应商的成本低于直接创建字符串消息的成本。

C. Supplier接口是1.8新出的一个接口,get方法用来返回该泛型类对象,具体详见jdk8新特性TODO。

 

四. JDK8源码阅读系列链接

  1. JDK8源码阅读(一) java.util.Object
  2. JDK8源码阅读(二) java.util.Objects
  3. JDK8源码阅读(三) java.io.Serializable   
  4. JDK8源码阅读(四) java.lang.Comparable
  5. JDK8源码阅读(五) java.lang.CharSequence
  6. JDK8源码阅读(六) java.lang.String

注: 今年要把JDK的一些基本的类的源码整理出来,欢迎大家指正和讨论。

         如果有错误的地方,欢迎各位老师指正。

         如果您觉得还不错,点个赞的话  我会很感激的,谢谢~

         转载请注明链接来源即可。