HashMap为什么要采用数组和链表来实现?

Jony-Li 2013-07-01 10:46:11
Hash表也称为散列表;在计算机上要找到同一个散列值的不同输入是不可能的,那么当HashMap输入相同key值的时候,就没必要将value值存贮到链表上了,直接替换原来的value值不是更好吗?效率是不是也提高了呢?这个问题一直困扰这我,期待大牛们解答……
...全文
1690 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kris1985 2013-10-11
  • 打赏
  • 举报
回复 1
当key 相等 或 equals 的时候本来就是覆盖啊,关键是根据key算出来的hashcode计算数组下标位置, 多个key的hashcode相同的时候会以链表的形式存储。数组内放的是链表的头节点。建议看看源代码吧 数组查找遍历快,链表删除,插入快,结合了这两者的有点
shine333 2013-07-04
  • 打赏
  • 举报
回复
引用 9 楼 weihan1314 的回复:
[quote=引用 7 楼 shine333 的回复:] 数组不必多言。至于为何用链表,我想问:大哥,凭什么替换啊?! 假设你原本想 { "KEY": "VALUE", // Hash对应的存储位置 "A": "123", // 0 "B": "456", // 1 "C": "555", // 4 "D": "666", // 3 "E": "777", // 2 "X": "XYZ" // 0 } 那么,显然,你不希望让Key="X"的Entry冲掉Key="A"的,而是希望他们和平共处吧。所以,对于hash后算出的存储位置,通过链表的方式避免错误。
你的意思是通过Hash算法算出的哈希值可能相同,因此在数组存储位置上创建一个链表来存储相同哈希值的数据,是这样的吗? [/quote] 对,但不一定是hash值一样。重点是通过hash算出的存储位置。假设你数组只有50个位置。可能hash = 1 和 hash = 1234567算出来的位置也是一样的。当然,两个hash一样的key,位置更是一样。
Jony-Li 2013-07-02
  • 打赏
  • 举报
回复
没人回帖就准备结贴了哦……
shine333 2013-07-01
  • 打赏
  • 举报
回复
数组不必多言。至于为何用链表,我想问:大哥,凭什么替换啊?! 假设你原本想 { "KEY": "VALUE", // Hash对应的存储位置 "A": "123", // 0 "B": "456", // 1 "C": "555", // 4 "D": "666", // 3 "E": "777", // 2 "X": "XYZ" // 0 } 那么,显然,你不希望让Key="X"的Entry冲掉Key="A"的,而是希望他们和平共处吧。所以,对于hash后算出的存储位置,通过链表的方式避免错误。
lcf 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 weihan1314 的回复:
引用 1 楼 lcf 的回复:
key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
百度百科说的啊?难道我要抛弃百度了?http://baike.baidu.com/view/273836.htm?fromId=1041476
速速抛弃
龙四 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 weihan1314 的回复:
引用 1 楼 lcf 的回复:
key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
百度百科说的啊?难道我要抛弃百度了?http://baike.baidu.com/view/273836.htm?fromId=1041476

public class Bean {
 public int hashCode() {
  return 47;
 }
}
龙四 2013-07-01
  • 打赏
  • 举报
回复
标准的链地址法处理哈希表冲突问题 还有开放地址法,LZ可以去参考下
Jony-Li 2013-07-01
  • 打赏
  • 举报
回复
引用 1 楼 lcf 的回复:
key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
百度百科说的啊?难道我要抛弃百度了?http://baike.baidu.com/view/273836.htm?fromId=1041476
lcf 2013-07-01
  • 打赏
  • 举报
回复
key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
Jony-Li 2013-07-01
  • 打赏
  • 举报
回复
引用 7 楼 shine333 的回复:
数组不必多言。至于为何用链表,我想问:大哥,凭什么替换啊?! 假设你原本想 { "KEY": "VALUE", // Hash对应的存储位置 "A": "123", // 0 "B": "456", // 1 "C": "555", // 4 "D": "666", // 3 "E": "777", // 2 "X": "XYZ" // 0 } 那么,显然,你不希望让Key="X"的Entry冲掉Key="A"的,而是希望他们和平共处吧。所以,对于hash后算出的存储位置,通过链表的方式避免错误。
你的意思是通过Hash算法算出的哈希值可能相同,因此在数组存储位置上创建一个链表来存储相同哈希值的数据,是这样的吗?
积木 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 weihan1314 的回复:
引用 1 楼 lcf 的回复:
key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
百度百科说的啊?难道我要抛弃百度了?http://baike.baidu.com/view/273836.htm?fromId=1041476
虽然根据哈希算法的不同,很有可能不会造成冲突,但是反过来讲,这样的数据结构也会造成巨大的内存浪费。 因此有限量的Hash表内存结构还是有必要的,在这种状态下,冲突的可能性会大大提高。 另外,就和楼上说的一样,完全没冲突的Hash算法,这个在数学上貌似还没严格证明吧,呵呵。

62,610

社区成员

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

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