HashMap存放对象时如果Key相同那么Value会进行覆盖,那么底层为什么要数组+链表?直接数组+散列算法不就好了?反正Key一样链表中的对象也只会是最后进来的!!

解决方案 »

  1.   

    因为不同的key可能会有相同的hashcode,宝贝
      

  2.   

    不同的key 有相同的hashCode 我懂,加了链表是会把hashCode一样的放在链表中,但是取的时候只取最后放进去的,那何必要链表呢?
      

  3.   

    取出最后一个?你的理解有误,put时,若key的hashCode相同,它不是直接将entry加在链表后面,而是在链表中对key逐一进行equals()判断key是否相同,若相同则覆盖,若没有则添加到链表中。
      

  4.   

    hascode相同的元素不一定是一样的  还要对比equals 判断是否完全一致相同要记住hascode相同equals不一定相同   equals相同的,hascode一定相同
      

  5.   

    object v = map.get(key);
    过程使首先根据key的hash算法,算出数组下标位置,然后遍历链表找到value。
    不同的key可能映射到数组相同下标,但是随后会比较key是否相等来返回value,此时会调用equals方法。也就是说equals不相等的key,会分别存入链表的不同位置。这样下标相同,但是本质上不相等的key,就都可以保存到链表的不同位置了。反之,如果equals相等的话,说明是同一个key,直接覆盖旧值。
      

  6.   

    hashcode相同key不同的值取出来的是不同的对象,链表里的东西可不是只能取出来最后一个
      

  7.   


    //节点里存了几个东西
    key
    value
    hash //对key进行哈希运算得出的值
    next //指向下一个节点
    给你打个比方吧 
    我这里有4个 不同的 keykey1
    key2
    key3
    key4//这里key1,和key2 的hash值相同你要知道HashMap里封装的是一个数组  只不过元素是链表(这里的数组元素都是链表的表头)
    key1 和key2 因为有相同的 hash值 所以对应同一个数组元素,
    put(key1,值)如果对应数组元素为null的话,恭喜了,key1去进数组里当表头去了
    put(key1,值)如果对应数组元素不为空,那就顺这这条链往下找,直到找到 next为null的地方,给你加到尾部
    如果哈希表里有key1,因为能顺到key1的位置,程序看到了key1 就直接把值付给这个节点里的value了