影响HashMap
性能的初始容量和负载因子两个参数。
默认加载因子(.75
)在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找成本。
将项目添加到HashMap
时,会根据其hashCode
的值和HashMap
的存储区大小将其分配给存储桶。
要识别任何哈希值,请使用key.hashCode()
并执行一些操作:
Bucket (index) = HashMap.indexFor(HashMap.hash(key.hashCode()),
entryArray.length)
当哈希映射中的条目数超过加载因子和当前容量的乘积时,哈希映射将被重新哈希(内部数据结构被重建),因此哈希映射具有大约两倍的桶数。
当您重新散列并将所有内容移动到新位置(存储桶等)时,旧元素也会再次重新散列并根据新的哈希码存储在新存储桶中。分配用于存储元素的旧空间是垃圾收集。
如果两个线程同时发现现在HashMap
需要重新调整大小并且他们都试图重新调整大小可能会导致HashMap
中的竞争条件。
在重新调整HashMap
的大小的过程中,存储在链表中的存储桶中的元素在迁移到新存储桶时会按顺序颠倒,因为java HashMap
不会追加新的在尾部的元素,而不是在头部附加新元素,以避免尾部遍历。如果发生竞争条件,那么你将最终得到一个无限循环。
我有以下问题:
答案 0 :(得分:0)
这就是我们ConcurrentHashMap
的原因。对于绝大多数情况,如果一个人没有在没有同步的情况下在多个线程上共享一个地图,那么普通的HashMap
就足够了。
无法保证与 n 存储桶发生冲突的两个对象仍会与2
因为我们正在重复冲突并且冲突在不同数量的存储桶中不一致,所以当您断言每个存储桶的列表作为过程的一部分被反转时,我怀疑您正在正确读取代码。
答案 1 :(得分:0)
index = hash % numberOfBuckets
。