您的位置:首页 > 编程语言 > Java开发

Java源码学习之Objects工具类

2020-02-17 12:12 543 查看

文章目录

Object工具类

  JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),可用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
  本次分析的是JDK8的源码。

Modifier and Type Method and Description
static <T> int
compare(T a, T b, Comparator<? super T> c)

当两个对象地址相同返回0。
地址不同时返回值由Comparator比较器接口对象c的comparecompare方法决定。
static boolean
deepEquals(Object a, Object b)

如果两个对象是深层相等的就返回true。
static boolean
equals(Object a, Object b)

如果两个对象相等时返回true。
static int
hash(Object... values)

生成输入的可变参的组合的哈希值
static int
hashCode(Object o)

当传入对象为null时返回0,否则返回该对象的哈希值。
static boolean
isNull(Object obj)

判断传入的对象是否为空,为空返回true。
static boolean
nonNull(Object obj)

判断传入的对象不为空,不为空时返回true。
static <T> T
requireNonNull(T obj)

检查输入的对象是否为null。
static <T> T
requireNonNull(T obj, String message)

检查输入的对象是否为null。,并自定义异常信息。
static <T> T
requireNonNull(T obj, Supplier<String> messageSupplier)

检查输入的对象是否为null。 ,并自定义异常信息。
static String
toString(Object o)

传入的参数为null时返回null,否则调该对象的toString方法。
static String
toString(Object o, String nullDefault)

传入的参数为null时返回nullDefault,否则调该对象的toString方法。

1 equals方法

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

  用Object的equals方法,假如调用equals的方法的对象为空,那么就会引起空指针异常,而Objects工具类不会报出空指针异常

  该方法的判断的思路是:

  ①:先判断两个对象的地址是否一致,一致时直接返回true,后面的代码不会执行。

  ②:假如两个对象的地址不一致时,此时前面的表达式为false。先判断对象a是否为空,为空就直接返回false。假如对象a不为空,则用对象a调用Object的equals方法。

  这样就不会有空指针异常了。

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

  传入两个Object类型的对象:

  ①:当两个对象地址相同是返回true。

  ②:当两个对象任意一个对象为空时,返回false。

  ③:调用Arrays的deepEquals0(a,b)方法,比较的是对象中的每个字段的值,

  当数组中存在空的元素时直接返回false,当比较的两个数组的长度不一样直接返回false。

  当数组中的元素与比较的数组进行比较的时候,完全相同则为相同,反之则为不相同。具体的源代码请大家自行查看,有点长我就不贴出来了。

  deepEquals方法内部是利用递归来实现的。用于判定两个指定数组彼此是否深层相等,此方法适用于任意深度的嵌套数组,通常比较多维数组。

3 hashCode方法

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

  当对象为空时返回0,对象不为空时调用Object的hashcode方法返回值。

4 hash方法

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

Arrays的hashCode方法

public static int hashCode(Object a[]) {
if (a == null)
return 0;

int result = 1;

for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());

return result;
}

传入一个Object类型的数组:

  ①:当数组为空时返回空。

  ②:遍历数组,每次执行的操作是当前result*31再加上数组元素的哈希值。

  ③:最后返回result。

5 toString方法_1

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

String类的valueOf方法

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

传入一个Object类型的对象:

  ①:对象为空时返回null。

  ②:对象不为空时调用对象的toString方法。

6 toString方法_2

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

传入一个Object类型的对象和字符串:

  ①:当对象为空时返回传入的字符串。

  ②:对象不为空时调用对象的toString方法。

7 compare方法

public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 :  c.compare(a, b);
}

传入两个要比较的对象和一个Comparator比较器接口对象c

  ①:当两个对象的地址相同是直接返回0。

  ②:当两个对象的地址不同时,调用Comparator比较器接口对象c的compare,返回值由compare方法决定,需要注意的是此方法的返回值只能是int类型。

8 requireNonNull方法_1

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

传入一个对象

  ①:当对象为空时,抛出空指针异常。

  ②:对象不为空时,返回该对象,不作任何修改。

  该方法通常用在判断某个对象是否为空,为空就抛出异常,就不会执行下面的代码了。

9 requireNonNull方法_2

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

  该方法和上面的重载方法的用法是一样的,只不过抛出的异常信息是我们自定义的。

10 isNull方法

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

  判断某个对象是否为空,为空返回true。

11 nonNull方法

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

  判断某个对象不为空,不为空时返回true。

12 requireNonNull方法_3

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

  JDK8新增的方法,传入一个对象和一个Supplier生产接口类型的对象,Supplier接口是一个函数式接口,它只有一个方法,即返回一个指定泛型的数据。此处泛型是String,即返回一个String类型的数据到自定义异常信息处。

  • 点赞 3
  • 收藏
  • 分享
  • 文章举报
培珺 发布了12 篇原创文章 · 获赞 6 · 访问量 971 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: