不重写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造成的问题的主要内容,如果未能解决你的问题,请参考以下文章
java基础重写equals()方法的同时要重写hashCode()方法