为什么要重写equals()方法 和 hashCode()方法
Posted 大茅坑的小石头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要重写equals()方法 和 hashCode()方法相关的知识,希望对你有一定的参考价值。
Equals 和 HashCode方法是属于Object的,所以每个对象都有自己的equals 和 HashCode方法
为什么要重写equals()方法
1、equals()默认是比较的对象地址(源码见下图),而不是比较的对象的属性值,不符合我们的期望。
特别指出八大包装对象(如int,float等对应的包装类)和String类已重写了equals和hashcode方法,默认比较的是值
为什么重写equals()时要重写hashCode()方法
1、为了符合规定,看jdk的api(下图),相等的对象必须具有相等的哈希码(补充:对象的哈希码相等但对象不一定相等)。
hashCode()默认是本地方法,返回对象内存地址的散列值。不重写equals()时是符合上述规定的,如果重写了equals()不重写 hashCode()就符合上述规定了。好啰嗦~~。
2、 实际应用。HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode()
同时还有一个重要的原因,我们都知道hash冲突是怎么解决的,用散列表!如果两个对象对应的hashCode相同,那么冲突的对象自然是放在后面的链表上面。着也就是说明两个对象的hashCode 相同并不代表两个对象是相等的,但是两个对象相同他们的hashCode值一定是相同的。
IDE快速生成equals 和 HashCode
阿里java开发手册也有规定
如果看完不理解,直接记住结论。
以上是关于为什么要重写equals()方法 和 hashCode()方法的主要内容,如果未能解决你的问题,请参考以下文章
【彻底理解】 为啥重写equals()方法为啥要重写hashCode()方法