我想知道用于构造ConcurrentHashMap的参数:

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

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

  • 另外:
  • 好的哈希码实现的标志是什么? (如果有一个SO问题解决了这个问题,只需链接到它。)

  • 谢谢!

    最佳答案

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

    长答案:

  • 负载系数是
    map 中“存储桶”的数量,以及
    预期要素的数量;
  • 0.75通常是一个合理的折衷方案-我记得,这意味着使用
    良好的哈希函数,平均而言,我们
    期望大约1.6重定向找到一个
    map 中(或该图周围)的元素;
  • 更改负载
    因素改变了
    更多重定向以查找元素,但
    减少浪费的空间-放置0.75为
    通常真的很有值(value);
  • 原则上,将ConcurrencyLevel设置为
    您的并发线程数
    希望可以修改 map ,
    虽然高估了这并没有
    似乎对其他人有不良影响
    而不是浪费内存(我写了一点
    ConcurrentHashMap performance
    前一阵子,如果你是
    感兴趣)

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

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

    10-06 09:05
    查看更多