今天在研究HashMap在1.8中的源码改动时,随手F3了链表节点Node类的equals方法里的equals
忽然发现,咦,好奇怪,怎么工程里打开了两个Object,
仔细一看才发现一个是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
如果用原生方法,如下会报空指针
但使用java.util.Objects就无需担心这个问题了
deepEquals方法,这个比较特殊,考虑到了数组的情况,而且对比数组时对比的不是数组对象本身,而是数组里面的具体对象。
compare方法,实现自定义的对象对比方法
返回各类形式的对象hashcode的方法有四个,分别是toString重载两个,hashCode,hash
hashCode方法,没什么特殊,就是比java.lang.Object.hashCode方法保证了null安全,遇到null返回0
hash方法,就是封装了Arrays.hashCode,当求一组对象的hashcode,但对象数量可变且无法或不想封装成数组时,可以用这个方法。
toString方法,toString(Object)又是对String.valueOf(Object)一个封装,完全不想用,toString(Object, String)依然是对null做了处理,在Object为null的时候可以返回一个自定义的有特定意义的值。
对象状态判断工具方法有五个,我认为可以忽略了……
像isNull方法,我更喜欢直接对比,不是还可以省下加载java.util.Objects类的内存空间么。
以上就是整个java.util.Objects的介绍,写完才发现没多少要讲的东西,难怪网上都没文章特意讲解,也算是又熟悉了一个类吧。至于在什么业务场景下使用,就全看大家的选择和自由发挥了。
可以预想某天以后,又可能出现丧心病狂的面试官像问collection collections有什么区别、final finally finalize有什么区别一样,来问Object和Objects有什么区别了。