文章目录
前言
本文章帮助大家对Objects
类的理解。
一、概述
Objects
意为对象(复数)。顾名思义,对象相关。此类仅开放静态方法,不能生成实例,作为一个对象相关的工具类。它提供操作、检查对象等的基础方法,如比较、哈希码、字符串转换、判空、检查下标等,若需要对一个、两个或多个“或空”对象使用这些基础功能,建议使用该工具类。
二、源码理解
包
package java.util;
import java.util.Objects;
使用Objects
类时,需引入此包。
Objects类
public final class Objects { /*...*/ }
final
类,无法继承。
Objects方法
Objects
private Objects() { throw new AssertionError("No java.util.Objects instances for you!"); }
构造函数私有化,使用户无法用此方法进行实例化。由于其它方法基本都是静态方法,所以将此类作为工具类使用即可,无需实例化。类内部使用此方法也将抛异常。
equals
public static boolean equals(Object a, Object b) { /*...*/ }
静态方法。判断两个“或空”对象是否相同(引用相同)。
deepEquals
public static boolean deepEquals(Object a, Object b) { /*...*/ }
静态方法。判断两个“或空”对象是否相同,或当其均为数组(或多层数组)时,递归地判断最底层元素是否均对应相同,即为深度相等。
其中使用到Arrays.deepEquals0
方法,参考Arrays.deepEquals0
方法。
hashCode
public static int hashCode(Object o) { /*...*/ }
静态方法。返回对象的哈希码,若为空对象,返回0。一个对象的哈希码通常不改变。若两个对象相同,则其哈希码相等;反之不然。通常可以用来帮助查找。
其中使用到Object.hashCode
方法,参考Object.hashCode
方法。
hash
public static int hash(Object... values) { /*...*/ }
静态方法。返回对象序列的哈希码,若对象序列为空,返回0;若对象序列仅含一个对象,返回值不等于此对象的哈希码。且改变对象顺序后返回结果不同。此方法可以用来重写实现某对象的哈希码(若此对象有若干成员,将这些成员作为参数传入,得到结果作为此对象的哈希码)。
其中使用到Arrays.hashCode
方法。计算公式为(其中
v
i
v_{i}
vi 为参数values
的第
i
i
i个元素的哈希码,
n
n
n 为对象数量):
3
1
n
+
3
1
n
−
1
∗
v
0
+
…
…
+
31
∗
v
n
−
2
+
v
n
−
1
31 ^ {n} + 31 ^ {n-1} * v_{0} + …… + 31 * v_{n-2} + v_{n-1}
31n+31n−1∗v0+……+31∗vn−2+vn−1
参考Arrays.hashCode
方法。
toString
public static String toString(Object o) { /*...*/ }
静态方法。将对象“转换”为字符串,若对象为空,返回“null”;其它情况返回 类名 + “@” + 哈希码的十六进制。
其中使用到Object.toString
方法,参考Object.toString
方法。
public static String toString(Object o, String nullDefault) { /*...*/ }
静态方法。将对象“转换”为字符串,同toString(Object o)
,不同的是,若对象为空,返回参数nullDefault
。
compare
public static <T> int compare(T a, T b, Comparator<? super T> c) { /*...*/ }
静态方法,传入泛型T
,为比较参数的类型。比较两个对象,若两个对象相同,返回0;其它情况返回比较器c
的比较结果。若要使用自定义比较器,需实现Comparator
接口的compare
、equals
方法。参考Comparator
接口。
requireNonNull
public static <T> T requireNonNull(T obj) { /*...*/ }
静态方法,传入泛型T
,为检查对象和返回对象的类型。检查对象是否为空并返回对象,若对象为空,抛出NullPointerException
异常。
public static <T> T requireNonNull(T obj, String message) { /*...*/ }
静态方法,传入泛型T
,为检查对象和返回对象的类型。检查对象是否为空并返回对象,同requireNonNull(T obj)
,不同的是,若对象为空,抛出带message
信息的NullPointerException
异常。
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) { /*...*/ }
静态方法,传入泛型T
,为检查对象和返回对象的类型。检查对象是否为空并返回对象,同requireNonNull(T obj)
,不同的是,若对象为空,且信息供应器messageSupplier
非空,抛出带messageSupplier.get()
信息的NullPointerException
异常。若要使用自定义供应器,需实现Supplier
接口的get
方法。参考Supplier
接口。
isNull
public static boolean isNull(Object obj) { return obj == null; }
静态方法。判断对象是否为空。
nonNull
public static boolean nonNull(Object obj) { return obj != null; }
静态方法。判断对象是否非空。
requireNonNullElse
public static <T> T requireNonNullElse(T obj, T defaultObj) { /*...*/ }
静态方法,传入泛型T
,为检查对象和返回对象的类型。类似requireNonNull
方法,检查对象是否为空并返回对象obj
,若obj
为空,判断defaultObj
并返回对象defaultObj
,若defaultObj
也为空,抛出带"defaultObj"
信息的NullPointerException
异常。
requireNonNullElseGet
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) { /*...*/ }
静态方法,传入泛型T
,为检查对象和返回对象的类型。类似requireNonNullElse
方法,检查对象是否为空并返回对象obj
,若obj
为空,判断供应器supplier
并返回对象supplier.get()
,若supplier
也为空,抛出带"supplier"
信息的NullPointerException
异常,若supplier.get()
也为空,抛出带"supplier.get()"
信息的NullPointerException
异常。
checkIndex
public static int checkIndex(int index, int length) { /*...*/ }
静态方法。检查下标index
是否越界(小于0或大于等于length
,当然若length
小于等于0,必有前面两种情况之一)并返回index
,若越界,抛出IndexOutOfBoundsException
异常。
checkFromToIndex
public static int checkFromToIndex(int fromIndex, int toIndex, int length) { /*...*/ }
静态方法。检查下标fromIndex
、toIndex
是否越界(小于0或大于length
)且fromIndex
是否大于toIndex
,并返回fromIndex
,若越界或fromIndex
大于toIndex
,抛出IndexOutOfBoundsException
异常。
checkFromIndexSize
public static int checkFromIndexSize(int fromIndex, int size, int length) { /*...*/ }
静态方法。检查下标fromIndex
、fromIndex + size
是否越界(小于0或大于length
)且size
是否小于0,并返回fromIndex
,若越界或size
小于0,抛出IndexOutOfBoundsException
异常。
总结
新人源码理解,望大家多多指点。