消息关闭
    暂无新消息!

对HashMap的疑问

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

6个回答

︿ 2
不同的key 有相同的hashCode 我懂,加了链表是会把hashCode一样的放在链表中,但是取的时候只取最后放进去的,那何必要链表呢?
︿ 2
hascode相同的元素不一定是一样的  还要对比equals 判断是否完全一致相同

要记住hascode相同equals不一定相同   equals相同的,hascode一定相同
︿ 1

//节点里存了几个东西
key
value
hash //对key进行哈希运算得出的值
next //指向下一个节点


给你打个比方吧 
我这里有4个 不同的 key

key1
key2
key3
key4

//这里key1,和key2 的hash值相同

你要知道HashMap里封装的是一个数组  只不过元素是链表(这里的数组元素都是链表的表头)
key1 和key2 因为有相同的 hash值 所以对应同一个数组元素,
put(key1,值)如果对应数组元素为null的话,恭喜了,key1去进数组里当表头去了
put(key1,值)如果对应数组元素不为空,那就顺这这条链往下找,直到找到 next为null的地方,给你加到尾部
如果哈希表里有key1,因为能顺到key1的位置,程序看到了key1 就直接把值付给这个节点里的value了


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