如何重用mala Scala标准库来创建根本不处理冲突的HashMap变体?
在Scala中的HashMap实现中我可以看到HashEntry,DefaultEntry和LinkedEntry这些特性是相关的,但我不确定我是否对它们有任何控制权。
答案 0 :(得分:1)
你可以通过扩展HashMap
来做到这一点(阅读HashMap
的源代码以查看需要修改的内容);基本上你覆盖put
和+=
以不调用findEntry
,并且你覆盖addEntry
(来自HashTable
)来简单地计算哈希码和把条目放到位。然后它根本不会处理collsions。
但这不是明智之举,因为HashEntry
结构专门用于处理碰撞 - next
指针在那时变得完全多余。因此,如果你出于性能原因这样做,这是一个糟糕的选择;因为你将所有东西都包裹在Entry
中,所以你有开销。如果您不想进行冲突检查,最好只将(键,值)元组存储在一个平面数组中,或者使用单独的键和值数组。
请记住,您现在将遇到哈希值中的冲突,而不仅仅是密钥。并且,通常情况下,HashMap
从小开始然后扩展,所以如果它从未开始变小,你最初会破坏性地碰撞那些幸存下来的东西。如果您知道要添加多少,那么您也可以覆盖initialSize
,这样您就不需要调整大小。
但是,基本上,如果你想编写一个特殊用途的高速不安全哈希映射,你最好从头开始编写它或使用其他一些库。如果您修改通用库版本,那么在没有所有速度的情况下,您将获得所有不安全的信息。如果它值得摆弄,那就值得完全重做。 (例如,您应该实现过滤器,以便映射f: (Key,Value) => Boolean
而不是映射(K,V)
元组 - 这样您就不必包装和解包元组。)
答案 1 :(得分:0)
我想这取决于你所说的“根本不处理碰撞”。 MultiMap上的薄层是否足以满足您的需求?