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的使用原则,是允许的。当然,哈希冲突越少越好,尽量采用好的哈希算法以避免哈希冲突。





猜你喜欢

转载自www.cnblogs.com/liwei2018/p/9029958.html