ConcurrentHashMap构造函数参数?

non*_*tor 23 java hashcode concurrenthashmap

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

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

我的问题是:

  • 应该使用什么标准来调整loadFactor或调低?
  • 我们如何建立并发更新线程的数量?
  • 应该使用什么标准来调整concurrencyLevel或调低?

另外:

  • 良好的哈希码实现的标志是什么?(如果SO问题解决了这个问题,请链接到它.)

谢谢!

Nei*_*fey 17

简短的回答:将"初始容量"设置为大致预期在地图中放置的映射数量,并将其他参数保留为默认值.

答案很长:

  • 载荷系数是地图中"桶"数与预期元素数之比;

  • 0.75通常是一个合理的折衷方案 - 我记得,这意味着通过良好的哈希函数,平均而言我们期望大约1.6个重定向来在地图中找到一个元素(或者在该图周围);

    • 改变负载系数会改变更多重定向之间的折衷,以找到一个元素,但浪费的空间更少 - 把0.75真的通常是一个很好的值;

    • 原则上,将ConcurrencyLevel设置为你希望修改地图的并发线程数,虽然高估这个并不会产生不好的影响,而不是浪费内存(我刚才写了一些关于ConcurrentHashMap性能 的文章,以防万一)感兴趣)

非正式地,您的散列函数应该基本上旨在尽可能多地在位中"随机".或者更严格地说,给定元素的哈希码应该给每个位大约50%的机会设置.用一个例子说明这个实际上更容易:同样,你可能对我写的关于String散列函数如何工作以及相关的散列函数指南的一些内容感兴趣.对这些东西的反馈是显而易见的欢迎.

我在某些方面也提到的一件事是你在实践中不必过于偏执:如果你的哈希函数在某些比特中产生"合理"的随机性,那么它通常就可以了.在最坏的情况下,将代表性的数据片段粘贴到字符串中并获取字符串的哈希码实际上并不是那么糟糕.