Java源码学习之Objects工具类
文章目录
- Object工具类
- 1 equals方法
- 2 deepEquals方法
- 3 hashCode方法
- 4 hash方法
- 5 toString方法_1
- 6 toString方法_2
- 7 compare方法
- 8 requireNonNull方法_1
- 9 requireNonNull方法_2
- 10 isNull方法
- 11 nonNull方法
- 12 requireNonNull方法_3
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
- 收藏
- 分享
- 文章举报
- SpringBoot 项目启动报 Failed to configure a DataSource: 'url' attribute is not specified
- 快速排序的Java实现
- 选择排序算法的Java实现
- MyEclipse Ant build.xml
- 2019-01-31初次使用springboot
- spring boot 多数据源
- java开发环境
- 在win7系统的myeclipse9.0下安装SVN插件
- springboot微信公众号自定义菜单创建及响应
- SecureCRT上传下载文件并运行java项目
- 初识JAVA
- 文件上传java ftpClient上传文件时总是卡在storeFile方法
- spring mvc 请求转发和重定向
- 基于注解的Spring AOP的配置和使用
- Spring任务调度器之Task的使用
- SpringMVC中定时器继承Task后无法对service注入问题
- Spring 4.x Task 和 Schedule 概述(代java配置)
- Json与javaBean之间的转换工具类
- 微信公众号的SpringBoot+Quartz的定时任务Demo
- springboot 学习资源推荐