java - ConcurrentHashMap 构造函数参数?

标签 java hashcode concurrenthashmap

我想知道构造一个ConcurrentHashMap的参数:

  • initialCapacity 默认为 16(已理解)。
  • loadFactor 默认为 0.75。
  • concurrencyLevel 默认为 16。

我的问题是:

  • 应该使用什么标准来向上或向下调整 loadFactor
  • 我们如何确定并发更新线程的数量?
  • 应该使用什么标准来向上或向下调整 concurrencyLevel

另外:

  • 良好哈希码实现的特点是什么? (如果一个 SO 问题解决了这个问题,只需链接到它。)

谢谢!

最佳答案

简短的回答:将“初始容量”设置为您希望在 map 中放置多少映射,并将其他参数保留为默认值。

长答案:

  • 负载系数是 map 中的“桶”数量和 预期元素的数量;

  • 0.75 通常是一个合理的折衷方案——我记得,这意味着 好的散列函数,平均而言我们 预计大约 1.6 个重定向可以找到 map 中(或该图周围)的元素;

    • 改变负载 因素改变之间的妥协 更多重定向以查找元素,但 更少浪费的空间——放 0.75 是 确实通常物有所值;

    • 原则上,将 ConcurrencyLevel 设置为 你的并发线程数 希望有修改 map , 虽然高估这并没有 似乎对其他有不良影响 比浪费内存(我写了一点 在 ConcurrentHashMap performance 不久前,以防万一 有兴趣)

非正式地,您的散列函数本质上应该旨在在位中具有尽可能多的“随机性”。或者更严格地说,给定元素的哈希码应该让每个位有大约 50% 的机会被设置。用一个例子来说明这一点实际上更容易:同样,你可能对我写的一些关于 how the String hash function works 的东西感兴趣。和相关的hash function guidelines .欢迎就这些内容提供反馈。

我在某些时候还提到的一件事是,在实践中您不必过于偏执:如果您的哈希函数在 一些 位中产生“合理”数量的随机性,那么它通常会没事的。在最坏的情况下,将具有代表性的数据片段粘贴到字符串中并获取字符串的哈希码实际上并没有那么糟糕。

关于java - ConcurrentHashMap 构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1573901/

相关文章:

Java:使用并发 hashmap 或 memcached 缓存

java - 从 Java 中的 HashMap 中删除值的子集

java - 如何在队列中使用异常

java - 为什么 session 之外的 Hibernate 实体应该实现 equals() 和 hashcode() ?

java - 如何使用正则表达式验证 1-99 的范围?

java - 为具有 "interchangeable"字段的对象实现哈希码

java - 是否可以在 java 中制作类似 Comparator 但用于实现自定义 equals() 和 hashCode()

java - 是否可以通过它的 key 同步 ConcurrentHashMap 更新?

java - 两个 IF 语句与一个 AND 语句

java.sql.SQLException : Parameter index out of range (2 > number of parameters, 为 0)