从头开始学JDK-------Objects
目录
* Objects #toString(String,String)
* Objects #requiredNonNull(T):T
* 前言
最早听说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;
}