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

知识就是力量,时间就是生命。这篇文章主要讲述为什么要重写equals()方法 和 hashCode()方法相关的知识,希望能为你提供帮助。
Equals 和 HashCode方法是属于Object的,所以每个对象都有自己的equals 和 HashCode方法
为什么要重写equals()方法1、equals()默认是比较的对象地址(源码见下图),而不是比较的对象的属性值,不符合我们的期望。
特别指出八大包装对象(如int,float等对应的包装类)和String类已重写了equals和hashcode方法,默认比较的是值

 
为什么重写equals()时要重写hashCode()方法1、为了符合规定,看jdk的api(下图),相等的对象必须具有相等的哈希码(补充:对象的哈希码相等但对象不一定相等)。

【为什么要重写equals()方法 和 hashCode()方法】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开发手册也有规定
如果看完不理解,直接记住结论。 


    推荐阅读