类别 | 初始容量 | 扩容方式 | 最大容量 |
---|---|---|---|
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)
小伙伴们,不明白的地方一定要去查源码哦!这样会理解更加深刻!!!