HashMap HashTable和ConcurrentHashMap的区别

博客探讨了重写equals方法后必须重写hashCode方法的原因。通过分析HashMap的put方法可知,它先通过key的hashCode确定散列位置,若该位置有值,再用equals判断key是否相等。若只重写equals,即使对象相等,因hashCode不同会散列到不同位置,导致错误结果。

https://www.cnblogs.com/binyue/p/4545550.html

 

 

为什么重写了equals方法就必须重写hashCode方法呢? 
绝大多数人都知道如果要把一个对象当作key使用的话,就需要重写equals方法。重写了equals方法的话,就必须重写hashCode方法,否则会出现不正确的结果。那么为什么不重写hashCode方法就会出现不正确结果了呢?这个问题只要仔细阅读一下HashMap的put方法,看看它是如何确定一个key是否已存在的就明白了。关键代码: 

  1. int hash = hash(key.hashCode());  
  2. int i = indexFor(hash, table.length);  
  3. for (Entry<K,V> e = table[i]; e != null; e = e.next) {  
  4.     Object k;  
  5.     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  6.         V oldValue = e.value;  
  7.         e.value = value;  
  8.         e.recordAccess(this);  
  9.         return oldValue;  
  10.     }  
  11. }  


首先通过key的hashCode来确定具体散列到table的位置,如果这个位置已经有值的话,再通过equals方法判断key是否相等。 
如果只重写equals方法而不重写hashCode方法的话,即使这两个对象通过equals方法判断是相等的,但是因为没有重写hashCode方法,他们的hashCode是不一样的,这样就会被散列到不同的位置去,变成错误的结果了。所以hashCode和equals方法必须一起重写。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值