当Key保证唯一时,HashMap的性能

D. *_*ore 4 java performance hashmap concurrenthashmap

如果我希望使用的密钥保证是唯一的(或者至少可以假设密钥是唯一的),那么使用' vanilla'ConcurrentHashMap可以提供最佳性能,还是需要散列函数或put方法被修改以避免不必要的散列?

此外,数字键是否比非数字键(例如具有适当散列函数的String或POJO)具有任何性能优势?

Jef*_*ter 7

正如评论中已经提到的,如果您不需要线程安全方面,那么请不要使用ConcurrentHashMap.

如果您想要绝对最佳的性能,请考虑实习您的密钥并使用IdentityHashMap.这避免了计算对象的哈希值(并且,如注释中所述,否定了需要equals进行评估),而是假设引用本身就是哈希值.

请注意,您必须确保同一个键的两个实例是同一个对象(例如,您必须确保引用相等,而不仅仅是对象相等).实习所有密钥是实现这一目标的一种方法.

实现说明:这是一个简单的线性探测哈希表,如Sedgewick和Knuth的文本中所述.阵列交替显示保持键和值.(对于大型表,这比使用单独的数组具有更好的局部性.)对于许多JRE实现和操作混合,此类将产生比HashMap更好的性能(HashMap使用链接而不是线性探测).

如果你知道所有的键,也许你也可以考虑完美的哈希?或映射到一个简单的数组结构?