具有单独链接的哈希图
是否有 java Map 接口的实现,它利用单独的链接作为冲突解决方案。通过阅读 HashMap 和 HashTable 的 javadocs,我得出的结论是,实现的作用基本上是替换值,并且本质上不采用任何冲突解决方案?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是否有 java Map 接口的实现,它利用单独的链接作为冲突解决方案。通过阅读 HashMap 和 HashTable 的 javadocs,我得出的结论是,实现的作用基本上是替换值,并且本质上不采用任何冲突解决方案?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
你错了:它使用每个存储桶的条目链接列表。
当将值放入映射中时,映射首先对键调用
hashCode
,然后转换此哈希代码,使其介于 0 和存储桶数量之间。如果桶为空,则密钥存储在该桶中。如果不是,则将此存储桶中的每个键与新键进行等于
比较。如果一相等,则其值被新值替换。否则,具有新密钥的新条目将添加到存储桶的条目列表中。如果要为给定键存储多个值,请使用
Map>
,或使用 Guava 的 MultiMap。You got it wrong: it uses a linked list of entries for each bucket.
When putting a value in the map, the map starts by calling
hashCode
on the key, then transforms this hash code so that it's between 0 and the number of buckets. If the bucket is empty, the key is stored in this bucket. If it's not, then every key in this bucket is compared to the new key withequals
. If one is equal, then its value is replaced by the new value. Else, a new entry with the new key is added to the bucket's list of entries.If you want to store multiple values for a given key, then use a
Map<Key, List<Value>>
, or use Guava's MultiMap.它确实具有冲突解决方案,但这是因为两个不同的密钥在散列后可能最终出现在同一个存储桶中。
如果您想为单个键存储多个值,则始终可以使用
HashMap>
并在必要时进行一些内务处理以初始化数组。It does have collision resolution, but that's because two different keys could plausibly end up in the same bucket after hashing.
If you want to store more than one value for a single key, you can always use
HashMap<KeyType, ArrayList<ValueType>>
and do some housekeeping to initialize the array when necessary.