我想知道构造一个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/