HashMap源码解读(jdk1.8)
1、相关常量
默认初始化容量(大小)
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
默认负载因子:用于扩容的,比如16*0.75=12,当容量达到12时就会扩容。
static final float DEFAULT_LOAD_FACTOR = 0.75f;
树化:链表变红黑树,前提是达到最小树化容量。
static final int TREEIFY_THRESHOLD = 8;
最小树化容量
static final int MIN_TREEIFY_CAPACITY = 64;
反树化:红黑书变链表
static final int UNTREEIFY_THRESHOLD = 6;
2、底层数据结构
数组+链表+红黑树
3、hash冲突怎么处理?
源码:
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p;
4、链表是尾部插入还是首部?
源码:
p.next = newNode(hash, key, value, null);
5、扩容机制?
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1; // double threshold