大家看看我理解的散列冲突对吗?

C_reator 2014-08-28 09:41:41
今天看java的时候看到了散列表/哈希表,它说低层是用链表数组实现的,即数组中存着链表,当我们要存入一个对象时,先计算该对象的散列码hashcode,然后除以桶数(数组的元素个数),得到的余数就是存放该对象的桶的索引。
但是书上说如果出现桶被占满的情况,就会出现散列冲突。我理解的是,桶中存着的是链表,链表不存在被用完了的情况,所谓的散列冲突是计算出来的散列值在散列表中已经存在了,比如散列值是13,桶数是3,计算出来该对象应该存在第1个桶,但是第一个桶中已经存在散列值为13的对象,这就是散列冲突。
不知道我这样理解对吗?求助一下~谢谢~
...全文
144 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
whos2002110 2014-08-29
  • 打赏
  • 举报
回复
如你所说桶数是3, 则hash() % 3 得到相同的结果, 比如13,7,22都会得到相同的散列值。 这个hash()方法是具体的实现提供的,HashMap、Hashtable实现不同
Inhibitory 2014-08-29
  • 打赏
  • 举报
回复
散列冲突是指计算出来的散列值已经存在。 链表是实现时解决散列冲突的一个手段。
scott_129 2014-08-28
  • 打赏
  • 举报
回复
差不多,是hashMap的实现原理。其实散列表解决散列值冲突有两种方式,一种是你描述的链表法,另一种是开发地址法。 就是当散列值hashCode值相同时,以单链表的形式来存储。当只有一个没有hashCode冲突时,其实就是以数组形式存储,出现冲突时,则在数组对应的位置为链表的引用地址了。

62,614

社区成员

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

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