底层实现结构

jdk1.7版本:以数组加链表的形式组成
jdk1.8版本:新增了红黑树的组成结构
如图:
HashMap结构

基本属性

// HashMap 初始化长度
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

// HashMap 最大长度
static final int MAXIMUM_CAPACITY = 1 << 30; // 1073741824

// 默认的加载因子 (扩容因子)
static final float DEFAULT_LOAD_FACTOR = 0.75f;

// 当链表长度大于此值且容量大于 64 时
static final int TREEIFY_THRESHOLD = 8;

// 转换链表的临界值,当元素小于此值时,会将红黑树结构转换成链表结构
static final int UNTREEIFY_THRESHOLD = 6;

// 最小树容量
static final int MIN_TREEIFY_CAPACITY = 64;

常见问题

1.什么是加载因子?加载因子为什么是 0.75?
加载因子:即扩容因子,负载因子;当HashMap的容量达到一定负载后,回进行扩容;比如,HashMap的初始长度是16,那么当HashMap中元素的数量达到16 * 0.75时,进行扩容。
加载因子过大,扩容的频率低,空间就小,Hash冲突高,运行效率低;
加载因子过小,会占用过分的空间。

2.什么时候链表转树,什么时候树转链表?
链表转树:链表长度大于等于8且数组的长度大于等于64
树转链表:链表长度小于等于6

3.什么时候调用resize方法进行扩容?
A.初始化table
B.HashMap的容量达到一定负载
C.某一个链表长度达到了8,但是数组的长度小于64

注意:java8中hashmap是先插入数据

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

一个喜欢拔刀的萌新Coder