java objects知道_java.util.Objects分析讲解与调试

今天在研究HashMap在1.8中的源码改动时,随手F3了链表节点Node类的equals方法里的equals

0d25e3576c2170b9867908bd07c53cbb.png

忽然发现,咦,好奇怪,怎么工程里打开了两个Object,

ed3acbf960672c95c74c63e9d9d815a7.png

仔细一看才发现一个是Object,一个是Objects,差一个s。所在的包也不一样,一个是java.lang.Object,一个是java.util.Objects。

再一看这个Objects类在1.7就已经加入了,有点汗颜,作为一个从1.6直接升级至1.8的程序员,今天才知道还有这个类的存在。

直接百度Objects,资料有点少,算了还是看源码和里面的文档吧。

API里对这个类的解释,翻译过来是这样的:

这个类由操作对象的静态实用方法组成。在对比对象的hashcode、返回对象字符串,对比两个对象时,这些静态方法了加入对null安全和对null容错的处理机制。

说人话!

好的。就是说这个类里都是静态方法,以前在做对象对比什么的时候,用java.lang.Object的方法直接对比需要考虑为null的情况,不然会报错,如果用这个类,那就不会报错了,这个类会自己处理null。

作为程序员,自然是关心什么时候才能用到这个类。下面让我们来一一分析。

java.util.Objects里面的方法大概分为三种,一种是对比对象的方法,一种是返回各类形式的对象hashcode的方法,最后一种是很鸡肋的对象状态判断工具方法。

对比对象的方法有三个,分别是equals、deepEquals、compare

equals方法,没什么特殊,正如类说明所说,只是处理了null

如果用原生方法,如下会报空指针

9f32743a66763c4d96de28ec9e239962.png

但使用java.util.Objects就无需担心这个问题了

7cef5715705c8c83192f8ce692532e7e.png

1a0c641428b2caab3a4f41028e845caf.png

deepEquals方法,这个比较特殊,考虑到了数组的情况,而且对比数组时对比的不是数组对象本身,而是数组里面的具体对象。

25da84612341b160f0929442be93b63e.png

compare方法,实现自定义的对象对比方法

e0a051778d99b547fb4a173a0ea5b2c0.png

返回各类形式的对象hashcode的方法有四个,分别是toString重载两个,hashCode,hash

hashCode方法,没什么特殊,就是比java.lang.Object.hashCode方法保证了null安全,遇到null返回0

78457aebe8f13bd437315e5b30ce46cb.png

hash方法,就是封装了Arrays.hashCode,当求一组对象的hashcode,但对象数量可变且无法或不想封装成数组时,可以用这个方法。

d2669e771d1d08d26cf54a09bbd3c7d6.png

toString方法,toString(Object)又是对String.valueOf(Object)一个封装,完全不想用,toString(Object, String)依然是对null做了处理,在Object为null的时候可以返回一个自定义的有特定意义的值。

b5d329dbe315dade9e4dcfea8ddaefa3.png

对象状态判断工具方法有五个,我认为可以忽略了……

像isNull方法,我更喜欢直接对比,不是还可以省下加载java.util.Objects类的内存空间么。

1fd29aec0d4e8d74a86ea2a4c54b26b7.png

以上就是整个java.util.Objects的介绍,写完才发现没多少要讲的东西,难怪网上都没文章特意讲解,也算是又熟悉了一个类吧。至于在什么业务场景下使用,就全看大家的选择和自由发挥了。

可以预想某天以后,又可能出现丧心病狂的面试官像问collection collections有什么区别、final finally finalize有什么区别一样,来问Object和Objects有什么区别了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值