南通科迅教育

Java当中的equals和hashCode

作者:科迅教育 2020年03月17日

在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范。

Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法。

这2个方法总是被人放在一起讨论。最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉。一次性搞清楚!

下面开始剖析。

public boolean equals(Object obj)

Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。

而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯 一性。这样我们在实现自己的类时,就要重写equals.

按照约定,equals要满足以下规则。

自反性: x.equals(x) 一定是true

对null: x.equals(null) 一定是false

对称性: x.equals(y) 和 y.equals(x)结果一致

传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。

一致性: 在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。

equals编写指导

Test类对象有2个字段,num和data,这2个字段代表了对象的状态,他们也用在equals方法中作为评判的依据。

在第8行,传入的比较对象的引用和this做比较,这样做是为了 save time ,节约执行时间,如果this 和 obj是 对同一个堆对象的引用,那么,他们一定是qeuals 的。

接着,判断obj是不是为null,如果为null,一定不equals,因为既然当前对象this能调用equals方法,那么它一定不是null,非null 和 null当然不等价。

然后,比较2个对象的运行时类,是否为同一个类。不是同一个类,则不equals。getClass返回的是 this 和obj的运行时类的引用。如果他们属于同一个类,则返回的是同一个运行时类的引用。注意,一个类也是一个对象。

1、 有些程序员使用下面的第二种写法替代第 一种比较运行时类的写法。应该避免这样做。

加微信咨询
黄老师 @科迅教育
微信号:ntk******88

获取课程资料+免费试听,体验强师课程!

微信咨询
相关资料
南通UI设计培训 学历低 学完好就业吗? 南通JAVA培训课程体系 南通C4D培训学完都可以做什么 南通软件开发培训需要学什么? 南通Java培训入门知识准备