Java中HashMap是使用拉链法来解决冲突的,请问是为什么?

hellenismsssss 2014-05-27 12:08:26
当向HashMap存入相同Key,不同Value的时候,旧值被覆盖。那何必用拉链法把相同Key的Value存入链表呢?百思不得骑姐啊- -!请问是为什么呢
...全文
737 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
This is bill 2016-07-10
  • 打赏
  • 举报
回复
HashCode是使用Key通过Hash函数计算出来的,由于不同的Key,通过此Hash函数可能会算的同样的HashCode,所以此时用了拉链法解决冲突,把HashCode相同的Value连成链表. 但是get的时候根据Key又去桶里找,如果是链表说明是冲突的,此时还需要检测Key是否相同
hellenismsssss 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 haorengoodman 的回复:
[quote=引用 1 楼 haorengoodman 的回复:] 不用的key,可能会有相同的hashcode
的key,可能会有相同的hashcode[/quote] 是的,但是直接覆盖原值就行了,即替换头结点即可,但是现在为什么要加入链表中呢,旧值已经用不到了,何必留着呢,没想明白啊。 比如 key1 - value 1 , key2 - value2 , key3 - value3存入HashMap之后,由于key1,key2,key3通过映射之后的hashCode都相同,则存储的时候使把value1,value2,value3构成一个链表,保存着相应的桶中。 既然是覆盖旧值,那何必保存value1,value2呢?直接就保存一个value3不就行了吗?
haorengoodman 2014-05-27
  • 打赏
  • 举报
回复
引用 1 楼 haorengoodman 的回复:
不用的key,可能会有相同的hashcode
的key,可能会有相同的hashcode
haorengoodman 2014-05-27
  • 打赏
  • 举报
回复
不用的key,可能会有相同的hashcode
hellenismsssss 2014-05-27
  • 打赏
  • 举报
回复
引用 5 楼 vnvlyp 的回复:
key1 key2 key3的hashCode相同,又不能保证key1 key2 key3相同,更不能保证value1 value2 value3相同,当然不能覆盖了
啊! 明白了,之前对HashCode没理解到位, HashCode是使用Key通过Hash函数计算出来的,由于不同的Key,通过此Hash函数可能会算的同样的HashCode,所以此时用了拉链法解决冲突,把HashCode相同的Value连成链表. 但是get的时候根据Key又去桶里找,如果是链表说明是冲突的,此时还需要检测Key是否相同... 终于搞明白了,谢谢
小绵羊 2014-05-27
  • 打赏
  • 举报
回复
一句话概括:存在一种情况即两个不同对象的hashcode相同,即所谓的hash冲突,链表就是用来解决hash冲突的。 附上hashmap的源码


 final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }
vnvlyp 2014-05-27
  • 打赏
  • 举报
回复
引用 3 楼 hellenismsssss 的回复:
[quote=引用 2 楼 haorengoodman 的回复:] [quote=引用 1 楼 haorengoodman 的回复:] 不用的key,可能会有相同的hashcode
的key,可能会有相同的hashcode[/quote] 是的,但是直接覆盖原值就行了,即替换头结点即可,但是现在为什么要加入链表中呢,旧值已经用不到了,何必留着呢,没想明白啊。 比如 key1 - value 1 , key2 - value2 , key3 - value3存入HashMap之后,由于key1,key2,key3通过映射之后的hashCode都相同,则存储的时候使把value1,value2,value3构成一个链表,保存着相应的桶中。 既然是覆盖旧值,那何必保存value1,value2呢?直接就保存一个value3不就行了吗?[/quote] key1 key2 key3的hashCode相同,又不能保证key1 key2 key3相同,更不能保证value1 value2 value3相同,当然不能覆盖了
haorengoodman 2014-05-27
  • 打赏
  • 举报
回复
hashmap 中存放数据的基本数据结构是数组,数组中的每个位置上,放的是一个链表

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧