java.util.Objects分析讲解与调试

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

122305_fxHz_3026173.png

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

122403_UQNJ_3026173.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

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

125239_oVwi_3026173.png

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

125347_Wfdm_3026173.png125532_cenk_3026173.png

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

130921_Z8F4_3026173.png

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

131416_2aG4_3026173.png

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

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

133816_8ZLR_3026173.png

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

133713_oqsT_3026173.png

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

133157_44Ni_3026173.png

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

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

132748_urSt_3026173.png

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

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

转载于:https://my.oschina.net/mappush/blog/786241

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值