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(),请教