不重写hash不重写equals造成的问题

Posted Go To Deserve It

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不重写hash不重写equals造成的问题相关的知识,希望对你有一定的参考价值。

不重写hash造成的问题

第一,就是不重写,调用object 的hashCode方法,用的是地址,
比如现在你map.put() 10000个对象,这时候对象都是不同的地址,计算出不同的对应的桶位置(数组位置),
这时候相当于你的 hashmap 都没用到链表和红黑树, 就会造成比如内存溢出,
然后还破坏了hashmap 本来应有的效率和设计的初衷。
重写了之后,计算出的可能会是相同的桶位置,进行链表。

第二,hashset 的去重,首先是比较hashcode,再比较equals,,如果不重写hashCode,就不能去重啊,可能就不符合自身的业务。

不重写equals

第一,会造成比如相同姓名的人,认为是相同的人, so应该重写equals 根据姓名+身份证号组合去判断

第二 小王在「堆」中有两套房产,这两套房产位于不同的地址。现在我想要判断这两套房子是否是同一个主人?

于是我去问Object,而Object告诉我这两套房产不是一个人的!

我:为什么呢?


Object: equals告诉我两套房子离了十万八千里,在不同的地方(地址),当然不是同一个人了。

我:这逻辑……(不符合我们常规的认知啊)

既然这样,那我只能重写equals了!


//注意:这是伪代码,省略了很多

//重写equals,认为身份证相同就是同一个人

@Override

public boolean equals(Object obj) {

return this.idCard == obj.idCard;

}

哈哈,好啦,现在equals终于知道这两个房子是同一人的啦!

以上是关于不重写hash不重写equals造成的问题的主要内容,如果未能解决你的问题,请参考以下文章

重写hashcode和equals怎么重写

java基础重写equals()方法的同时要重写hashCode()方法

重写 equals 方法时必须重写 hashcode 方法

Java为什么要同时重写equals和hashcode

谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法

JAVA中重写equals方法为啥要重写hashcode方法说明