为什么要重写equals()方法 和 hashCode()方法

Posted 大茅坑的小石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要重写equals()方法 和 hashCode()方法相关的知识,希望对你有一定的参考价值。

Equals 和 HashCode方法是属于Object的,所以每个对象都有自己的equals 和 HashCode方法

为什么要重写equals()方法

1、equals()默认是比较的对象地址(源码见下图),而不是比较的对象的属性值,不符合我们的期望。

特别指出八大包装对象(如int,float等对应的包装类)和String类已重写了equals和hashcode方法,默认比较的是值

为什么要重写equals()方法

 

为什么重写equals()时要重写hashCode()方法

1、为了符合规定,看jdk的api(下图),相等的对象必须具有相等的哈希码(补充:对象的哈希码相等但对象不一定相等)。

为什么要重写equals()方法

hashCode()默认是本地方法,返回对象内存地址的散列值。不重写equals()时是符合上述规定的,如果重写了equals()不重写 hashCode()就符合上述规定了。好啰嗦~~。

为什么要重写equals()方法

2、 实际应用。HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode()

    同时还有一个重要的原因,我们都知道hash冲突是怎么解决的,用散列表!如果两个对象对应的hashCode相同,那么冲突的对象自然是放在后面的链表上面。着也就是说明两个对象的hashCode 相同并不代表两个对象是相等的,但是两个对象相同他们的hashCode值一定是相同的。

 

IDE快速生成equals 和 HashCode

为什么要重写equals()方法

为什么要重写equals()方法 

为什么要重写equals()方法

阿里java开发手册也有规定

为什么要重写equals()方法

如果看完不理解,直接记住结论。 


以上是关于为什么要重写equals()方法 和 hashCode()方法的主要内容,如果未能解决你的问题,请参考以下文章

为什么要重写equals和hashcode方法

java为什么要重写hashCode和equals方法?

为啥重写equals方法,一定要重写HashCode方法?

【彻底理解】 为啥重写equals()方法为啥要重写hashCode()方法

JAVA中重写equals()方法为什么要重写hashcode()方法?

java中重写Object类的equals方法为啥要重写hashcode方法?不重写可以吗?