JDK 1.8 HashMap

  1. 尽量不要修改负载因子。负载因子默认为0.75。太高会减少空间成本,但会增加查找的时间成本。太低会增加空间成本,但会减少查找的时间成本。默认值设定为0.75是取了一个平衡点,建议不要随意修改。

  2. 尽量初始化时预估HashMap的容量。因为resize扩容是很浪费性能的,resize时会把旧数组中的节点全部转移到新的数组中,中间会重新计算节点所在数组的位置。节点要么在原位置上,要么在原位置+oldCap上。(这也是JDK 1.8 优化的地方)

  3. 不要在并发时使用HashMap,可以用Collections.synchronizedMap()或者使用ConcurrentHashMap

  4. hashCode函数

    static final int hash(Object key) {
        int h;
        // 高16位与低16位异或得到 key 的 hash 值。这样高位也参与到了 hash 的计算中。这就产生了扰动,扰动生成分布更均匀的 hash 码,并加大低位的随机性
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);  
    }
  1. 关于桶的index碰撞
// n - 1 与 hash 做位与运算,得到的余数为桶中的 index。n 正好为2的 N 次幂。
// a % 2^n == a & 2^n - 1 == 2^n - 1 & a (交换律)
// hash 分布越是均匀得到的碰撞概率就越小,所以需要上面的高16位与低16位做异或
(n - 1) & hash

你可能感兴趣的:(JDK 1.8 HashMap)