List集合底层解析
解析List集合子类ArrayList、Vector、LinkedList底层及扩容机制
ArrayList
特点
- 高效率
- 不安全
- 有序
扩容机制1.使用无参构造器初始化时,会创建一个elementData的空数组,没有初始容量.
2.当调用集合第一次进行add操作时,会进行当前数组elementData是否是空判断,如果为空,则形成一个最小所需容量为10的最小长度,随后则进行扩容,如果根据所需容量计算的结果小于0,则进行新容量的反赋值操作,随后则调用Arrays.copyOf方法进行数组的赋值,并且完成赋值。
3.当所需容量大于10的时候,则按照现有容量的1.5倍进行扩容,并完成赋值。
4.使用有参构造时则使用有参构造初始化elementData数组,当容量不够时,同上3
private void grow(int minCapacity) { // overflow-conscious code // 当前数组的长度 int oldCapacity = elementData.length; // 计算扩容 int newCapacity = oldCapacity + (oldCapacity >> 1); // 当所需容量大于新容量的时候,则使用所需容量进行扩容 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = https://www.it610.com/article/Arrays.copyOf(elementData, newCapacity); }
Vector集合
特点 - 低效率
- 安全
- 有序
扩容机制1.使用无参构造初始化时,默认容量为10.
/** * Constructs an empty vector so that its internal data array * has size {@code 10} and its standard capacity increment is * zero. */ public Vector() { this(10); }
2.当所需容量小于现有容量时,会按照现有容量的2倍进行扩容
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; // 因为capacityIncrement默认为0,所以扩容等同于:现有容量+现有容量(2倍) int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = https://www.it610.com/article/Arrays.copyOf(elementData, newCapacity); }
【List集合底层解析】3.调用Arrays.copyOf方法进行数组的复制,并完成赋值。
推荐阅读
- 图书集合完毕
- 医生随笔(232)不要轻易得罪底层人
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- Flutter的ListView
- 1.2序列通用操作
- 社群培训系统day6复盘—小白学习社群的底层逻辑
- Java应该在哪里判断List是否为空
- 部署专题集合
- grep|grep 时 Argument list too long
- Java集合框架|Java集合框架 数据结构