java - 保证键唯一时 HashMap 的性能

标签 java performance hashmap concurrenthashmap

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

此外,与非数字键(例如具有适当哈希函数的字符串或 POJO)相比,数字键是否具有任何性能优势?

最佳答案

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

如果您想要绝对最佳性能,请考虑保留您的 key 并使用 IdentityHashMap .这避免了计算对象的散列(并且,如评论中所述,不需要评估 equals),而是假设引用本身就是散列。

显然,您必须确保同一键的两个实例是同一对象(例如,您必须确保引用相等,而不仅仅是对象相等)。实习所有的 key 是实现这一目标的一种方法。

Implementation note: This is a simple linear-probe hash table, as described for example in texts by Sedgewick and Knuth. The array alternates holding keys and values. (This has better locality for large tables than does using separate arrays.) For many JRE implementations and operation mixes, this class will yield better performance than HashMap (which uses chaining rather than linear-probing).

如果你知道所有的键,也许你也可以考虑perfect hashing ?还是映射到一个简单的数组结构?

关于java - 保证键唯一时 HashMap 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6664306/

相关文章:

java - 将 Base64 字符串保存到文件

android - 如何在不更改其功能的情况下覆盖处理未捕获的异常

java - 从 hibernate 中获取查询的执行时间

java - 多线程服务器客户端应用程序多次发送响应

Java - 创建多个 HashMap 并使用 for 循环填充它们 - 有更好的方法吗?

java - 在 ant build 中排除文件

java - DeleteByName 方法不适用于 RandomAccessFile

java - 使用 HashMap 从字符串中第一次出现后删除单词 "real"

更新重复行的 MySql 查询非常慢。建议需要加快

java - 如何将集合转换为列表?该集合用作 Hashmap 中的键