equals和hashcode的联系

Posted liwei2018

tags:

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

obj中的equals方法,默认比较的是内存地址;
public boolean equals(Object obj) {
return (this == obj);
}
hashcode 方法是native的,在c++中实现的;

如果重写,java对象的equals和hashcode是这样规定的:
1.相等的对象必须具有相同的hashcode值;
  如果两个java对象A和B,A和B的euqals结果为true,hashmap的put方法是pus时流程如下:
    hash(key)得到key的hashcode(),hashmap根据获得的hashcode找到要插入的位置所在的链,
    在这个链里面放的都是hashcode相同的Entry键值对,在找到这个链之后,会通过equals()方法判断是否已经存在要插入的键值对。
  如果第一步hashcode值已经不同了,那么就会重复插入两个key,违反了hashmap的原则。
2.hashcode相同,对象不一定相同;
  假如两个Java对象A和B,A和B不相等(eqauls结果为false),但A和B的哈希码相等,将A和B都存入HashMap时会发生哈希冲突,
  也就是A和B存放在HashMap内部数组的位置索引相同这时HashMap会在该位置建立一个链接表,将A和B串起来放在该位置,显然,
  该情况不违反HashMap的使用原则,是允许的。当然,哈希冲突越少越好,尽量采用好的哈希算法以避免哈希冲突。





以上是关于equals和hashcode的联系的主要内容,如果未能解决你的问题,请参考以下文章

hashmap中equals() 和hashcode(),请教

覆盖equals时总要覆盖hashCode

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

hashcode与equals的作用区别和联系

equals和hashcode的联系

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?