类别 |
初始容量 |
扩容方式 |
最大容量 |
HashMap |
16 |
达到0.75就乘2 |
2的30次方 |
HashSet |
16 |
达到0.75就乘2 |
2的30次方 |
Hashtable |
11 |
达到0.75就乘2+1 |
Integer.MAX_VALUE-8 |
ArrayList |
10 |
满了就乘1.5 |
Integer.MAX_VALUE-8 |
StringBuffer |
16 |
满了就乘2+2 |
|
StringBuilder |
16 |
满了就乘2+2 |
|
以上扩容机制在JAVA源码中均可以找到,以HashMap为例
这里
DEFAULT_INITIAL_CAPACITY 代表初始容量
MAXIMUM_CAPACITY 代表最大容量
DEFAULT_LOAD_FACTOR 代表装填因子表示达到容量的0.75就扩容
扩容代码 ,新容量变为旧容量的2倍;新阈值变为旧阈值的两倍
(容量:capacity 阈值:threshold)
为什么 -8
因为自己作为数组,除了存储数据本身以外、还需要32 bytes的大小来存储对象头信息。Java中的每个对象都包含了对象头,HotPot虚拟机中对象头的大小不会超过32bytes,所以最大容量减8不会溢出
(1 int = 4 bytes)
小伙伴们,不明白的地方一定要去查源码哦!这样会理解更加深刻!!!