HashMap put存值调用hashcode判断key是否冲突,如果冲突就会在当前数组的bucket以链表的形式进行存值。但是我们在使用的时候当t两个相同的key明显是覆盖之前的key的value; 当两个相同的key 它的hashcode也必然相等  也就是这一点是冲突的。懂的大神能否解答下,感谢感谢

解决方案 »

  1.   

    听不懂你的问题究竟是什么 HashMap的键唯一,值不唯一,用put方法存储的时候,会先看看集合里面有没有即将存储元素的键,如果没有,就把键值对存进去,如果有,就会变成修改原有键的值。
      

  2.   

    应该是在调用hashCode算法之前  会先判断key存不存在,存在直接覆盖。不存在在通过hashcode算出key 对应的bucket位置
      

  3.   

    收到一个key,先计算hashCode计算位置,位置上已经有了其他key,则看下这两个key的equal相等不,相等则覆盖value,不相等则存成链表或者红黑树
      

  4.   

    key相等,hashcode一定相等,但是key不等,hashcode却是有可能相等,假如你的key是2和6,而hashcode计算方法是 mod8,计算出来的hashcode都是2,这样就会以链或树的形式解决hash冲突。
    关于新值覆盖旧值,是key相等的情况下(即hashcode相等),更新value。
      

  5.   

    上面写错了 ,是假如key是2和10
      

  6.   

    没看懂你的话感觉有点混乱。讲讲put的原理吧
    总之map存数据,先算key的hashcode,
    然后用hashcode判断应该放到数组的哪个bucket,
    如果那个bucket为空,则直接放进去,
    而如果那个bucket不为空,则一一遍历bucket里的key,
    遍历的同时,会使用equals方法判断是否与当前key相等,
    如果有相等的,则会用当前key带的value覆盖原来那个key的value,
    如果没相等的,则吧当前key挂到这个bucket的链表上,
    当这个链表大小大于等于8,会变成红黑树,
    当这个红黑树大小重新降下来,小于等于6,就变回链表,