Scala:在没有链表的情况下构建HashMap变体的正确方法是什么?

Scala:在没有链表的情况下构建HashMap变体的正确方法是什么?,scala,performance,hashmap,scala-2.8,Scala,Performance,Hashmap,Scala 2.8,如何重用mouch Scala标准库来创建完全不处理冲突的HashMap变体 在Scala中的HashMap实现中,我可以看到HashEntry、DefaultEntry和LinkedEntry的特性是相关的,但我不确定是否可以控制它们 您可以通过扩展HashMap(阅读HashMap的源代码,查看需要修改的内容);基本上,您将覆盖put和+=以不调用findEntry,并且您将覆盖addEntry(从哈希表)以简单地计算哈希代码并将条目放置到位。那它就根本无法处理冲突了 但这样做并不明智,因为

如何重用mouch Scala标准库来创建完全不处理冲突的HashMap变体

在Scala中的HashMap实现中,我可以看到HashEntry、DefaultEntry和LinkedEntry的特性是相关的,但我不确定是否可以控制它们

您可以通过扩展
HashMap
(阅读
HashMap
的源代码,查看需要修改的内容);基本上,您将覆盖
put
+=
以不调用
findEntry
,并且您将覆盖
addEntry
(从
哈希表
)以简单地计算哈希代码并将条目放置到位。那它就根本无法处理冲突了

但这样做并不明智,因为
HashEntry
结构是专门为处理冲突而设计的,
next
指针在这一点上变得完全多余。因此,如果您出于性能原因而这样做,那么这是一个错误的选择;您有开销,因为您将所有内容包装在
条目中
。如果不想进行冲突检查,最好只将(键、值)元组存储在平面数组中,或者使用单独的键和值数组

请记住,您现在将遭受哈希值的冲突,而不仅仅是键的冲突。通常情况下,
HashMap
从很小的地方开始,然后扩展,所以最初你会破坏性地碰撞一些本来可以存活下来的东西,如果不是从小处开始的话。如果您知道要添加多少,就可以覆盖
initialSize
,这样就不需要调整大小


但是,基本上,如果您想编写一个专用的高速不安全哈希映射,最好从头开始编写,或者使用其他库。如果您修改通用库版本,您将获得所有的不安全性,而没有所有的速度。如果它值得玩弄,那么它值得完全重做。(例如,您应该实现过滤器并映射
f:(Key,Value)=>Boolean
,而不是映射
(K,V)
元组——这样您就不必包装和展开元组。)

我想这取决于您所说的“根本不处理冲突”是什么意思。多层地图上的薄层是否足以满足您的需要?

回答得很好,谢谢。我想从头开始重新实现。但我不想实现几十种方法。我想重用一些基于一些基本方法的方法实现(如foldLeft、exists、find等)。我必须实现的基本方法的最小集合是什么?我必须使用什么特性?@ukasz:我认为最好的办法是查看
HashMap
HashTable
的源代码,并使用它,直到您了解它的工作原理。以一种好的方式扩展2.8集合需要相当多的工作。据我所知,代码本身是依赖树的唯一文档
Iterable
只需要很少的资源,但子类会覆盖树的各个部分,以提高效率和/或添加功能。