java.util.HashMap

来源:互联网 发布:imovie的windows版 编辑:程序博客网 时间:2024/06/05 20:50

要点

  1. 数据结构:数组+链表+红黑树(链表中节点大于8时)
  2. 初始数组长度:DEFAULT_INITIAL_CAPACITY = 1 << 4;(16)
  3. 扩容因子:默认值0.75
  4. 当节点数超过阈值(数组长度*扩容因子)时,数组长度和阈值均扩容到原来2倍,扩容时,需要重新根据hash值计算节点在新数组的位置,数组最大容量为Integer.MAX_VALUE
  5. 为什么HashMap容量一定要为2的幂呢?目的是让节点均匀分布在数组中,提高查询效率,增大空间利用率
  6. 判断key值是否相等:if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))。注意:此处需要先比较hash值,因为索引值一样,hash值可能不一样
  7. 综上,可知理想容量为C/0.75,如果计算结果不是2的幂也没关系,初始化时会自动像上找最小2的幂对应的数值进行初始化

获取hashcode

 static final int hash(Object key) {        int h;        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);    }

定位数组中位置

 if ((tab = table) == null || (n = tab.length) == 0)    n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null)     tab[i] = newNode(hash, key, value, null);