我知道Open Addressing和Chaining之间在解决哈希冲突方面的区别。大多数基于哈希的基本哈希数据结构(如Java中的HashSet
,HashMap
主要使用链接技术。我读到ThreadLocal实际上使用了探测方案。所以我想理解为什么开放式寻址在Java中没有那么多用?我的意思是,使用该方案删除记录很困难,因为您必须使用一些特殊处理来标记这些单元格。然而,开放寻址方案的内存要求似乎很低。
编辑:我只想了解此设计决策可能的主要原因/原因。我不想要更精细的细节。此外,我想知道为什么ThreadLocal使用较少见的开放寻址技术。我想这两个答案可以联系在一起。所以我更喜欢在同一个问题中问自己。
答案 0 :(得分:13)
我目前正在讨论HashMap
和HashSet
的内存紧凑重新实现,其中包括Doug Lea。这个特殊的问题还没有出现,但这是我对这个问题的初步想法......
remove
对于开放式表格来说并不是一个愉快的操作。作为一般规则,remove
是哈希表上最不常见的操作,但是应用程序,它们更常见,并且会注意到性能不佳。LinkedHashMap
被写为HashMap
的子类,并借用了大部分实现细节;当条目是离散对象时,实现条目的链接列表会更容易一些 - 此时,您已经在链接实现的大部分路径上了。