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

时间:2010-05-09 18:56:57

标签: scala performance hashmap scala-2.8

如何重用mala Scala标准库来创建根本不处理冲突的HashMap变体?

在Scala中的HashMap实现中我可以看到HashEntry,DefaultEntry和LinkedEntry这些特性是相关的,但我不确定我是否对它们有任何控制权。

2 个答案:

答案 0 :(得分:1)

可以通过扩展HashMap来做到这一点(阅读HashMap的源代码以查看需要修改的内容);基本上你覆盖put+=以不调用findEntry,并且你覆盖addEntry(来自HashTable)来简单地计算哈希码和把条目放到位。然后它根本不会处理collsions。

但这不是明智之举,因为HashEntry结构专门用于处理碰撞 - next指针在那时变得完全多余。因此,如果你出于性能原因这样做,这是一个糟糕的选择;因为你将所有东西都包裹在Entry中,所以你有开销。如果您不想进行冲突检查,最好只将(键,值)元组存储在一个平面数组中,或者使用单独的键和值数组。

请记住,您现在将遇到哈希值中的冲突,而不仅仅是密钥。并且,通常情况下,HashMap从小开始然后扩展,所以如果它从未开始变小,你最初会破坏性地碰撞那些幸存下来的东西。如果您知道要添加多少,那么您也可以覆盖initialSize,这样您就不需要调整大小。

但是,基本上,如果你想编写一个特殊用途的高速不安全哈希映射,你最好从头开始编写它或使用其他一些库。如果您修改通用库版本,那么在没有所有速度的情况下,您将获得所有不安全的信息。如果它值得摆弄,那就值得完全重做。 (例如,您应该实现过滤器,以便映射f: (Key,Value) => Boolean而不是映射(K,V)元组 - 这样您就不必包装和解包元组。)

答案 1 :(得分:0)

我想这取决于你所说的“根本不处理碰撞”。 MultiMap上的薄层是否足以满足您的需求?