Java入门系列之hashCode和equals(十二)

前面两节内容我们详细讲解了Hashtable算法和源码分析,针对散列函数始终逃脱不掉hashCode的计算,本节我们将详细分析hashCode和equals,同时您将会看到本节内容是从《Effective Java》学习整理而来(吐槽一句,这本书中文版翻译的真垃圾),对于《Effective Java》这本书很有学习价值,但是我不会像其他童鞋一样,直接从这本书讲解一个系列,我所采用的是学习到对应地方然后参考不同java经典书籍进行总结,循序渐进式这样效果更佳,好了,我们开始吧。

equals

翻看《Effective Java》关于equals这一节内容,直接抛出重写equals必须遵守的如下五大约定,当我看到这几大特性时,顿时惊呆了,这不就是大学线代讲解矩阵时的特点么,学以致用原来是这么个道理。

1、自反性:对于非空的对象x,x.equals(x)必须返回true.

2、对称性:对于非空的对象x和y,若x.equals(y)等于true时,那么y.equals(x)也必须返回true.

3、传递性:对于非空的对象x、y和z,如果x.equals(y)和y.equals(z)等于true时,那么x.equals(z)也必须返回true

4、一致性:对于非空的对象x和y,如果利用equals判断对象的信息没有被修改时,无论调用多少次,那么x.equals(y)要么为true,要么为false

5、对于非空的对象x,x.equals(null)必须返回false

关于第一点很好理解,非空对象自身引用必须相等,对于第二点书中所给的例子则是将重写对象比较某个字符串时不区分大小写,但是字符串对象是区分大小写,如此这样将导致对称不一致问题,对于第三点则是继承时注意equals的传递性,第4点则强调多次调用通过equals判断的恒等性,最后一点更好理解如若不判断则会抛出空指针异常。那么我们实际在重写equals时可将以下几点作为模板来使用就可以啦。

1、使用“==”判断两个对象是否引用相同

2、使用instanceof操作符来检查参数类型是否相同

3、若类型相同,则将参数转换为正确的类型

4、比较对象中每个值是否都相等,若全部相等则返回true,否则为false

如上几点模板来自《Effective Java》对重写equals的总结,当然我们可以从重写字符串对象中的equals找到如上影子,字符串对象的equals方法如下:

public boolean equals(Object anObject) { // 判断对象引用是否相等,相等直接返回 if (this == anObject) { return true; } //判断对象参数类型是否正确 if (anObject instanceof String) { //若参数类型相同,则转换为对应的参数类型 String anotherString = (String)anObject; int n = value.length; //比较参数对象中的所有值是否相等 if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwyyp.html