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

猜你喜欢

转载自www.cnblogs.com/xingrui/p/10767632.html