乐趣区

关于java:HashMap

摘自 jdk 1.8 HashMap

/**
• The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

默认初始化长度为 16。1 << 4 效率没有 16 高,只是为了强调是 2 的 n 次幂。

HashMap 的加载因子,默认是 0.75

1. /**
2.      * The load factor used when none specified in constructor.
3.      */
4. static final float DEFAULT_LOAD_FACTOR = 0.75f;

当 HashMap 中元素数超过容量 * 加载因子时,HashMap 会进行扩容。

HashMap 的数据结构,数组 + 链表。

扩容

resize() 办法。
触发机会:put 元素之后。
超过初始大小 * 加载因子的时候会登程扩容, 新建一个 table[] 数组,是原来长度的 2 倍。
如果达到了最大值,不扩容。
jdk 1.7 和之前 头插法,线程不平安,扩容和 put 同时进行,链表有几率成环,扩容死循环。
jdk 1.8 后 尾插法,put 和 get 线程同样不平安,currentHashMap 线程平安。
jdk1.8 后链表长度大于 8 会思考是否转成红黑树。如果 table 长度不满 64,会优先触发 resize(), 从新散列。如果大于 8,并且 hashMap 大于 64,会触发链表转为红黑树。
小于 6 在 resize 的时候会触发红黑树转链表。

退出移动版