Java集合框架之ArrayList解析
- 互联网
- 2025-08-24 13:27:02

目录
一、ArrayList概述
二、优缺点分析
三、底层数据结构
四、源码分析ArrayList初始化容量
五、源码分析ArrayList扩容策略
六、ArrayList集合源码分析
1. 属性分析
2. 构造方法分析
无参构造方法
指定初始容量的构造方法
传入集合的构造方法
3. 添加元素
add(E e)方法
add(int index, E element)方法
4. 修改元素
set(int index, E element)方法
5. 插入元素
6. 删除元素
remove(int index)方法
remove(Object o)方法
七、Vector
1. 底层结构与线程安全
2. 初始容量与扩容策略
3. 为何逐渐被弃用?
一、ArrayList概述
ArrayList是Java集合框架中最常用的类之一,基于动态数组实现,继承自AbstractList并实现了List接口。它提供了高效的元素访问能力,适合频繁查询但少随机增删的场景。本文将从源码层面深入分析其设计原理、性能特点及最佳实践。
二、优缺点分析优点:
高效随机访问:通过下标直接访问元素,底层是数组,因此根据下标查找元素的时间复杂度是O(1)。因此检索效率高。
list.get(3); // 直接访问索引3处的元素尾部操作高效:在数组末尾添加或删除元素时,时间复杂度为 O(1)(无需移动元素)。
缺点:
随机增删效率低:在数组中间插入或删除元素时,需移动后续元素,时间复杂度为 O(n)。不过只要数组的容量还没满,对末尾元素进行增删,效率不受影响
list.add(2, "Java"); // 插入到索引2,后续元素后移内存浪费:数组容量可能大于实际元素数量,占用额外内存
三、底层数据结构ArrayList的核心是一个Object[] elementData数组,所有元素按插入顺序依次存储。数组的连续内存特性使得其支持通过下标快速访问元素(时间复杂度O(1))。
// JDK 11源码片段 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { transient Object[] elementData; // 存储元素的数组 private int size; // 实际元素个数 } 四、源码分析ArrayList初始化容量在 Java 中,ArrayList类有多个构造方法,不同构造方法对初始容量的处理不同:
无参构造方法:初始容量为 0,当第一次调用add方法时,容量会被初始化为 10。 带初始容量参数的构造方法:使用指定的初始容量。 带集合参数的构造方法:初始容量为传入集合的大小。下面是ArrayList无参构造方法的源码:
/** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组:
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};无参构造:创建一个空数组(初始容量为0),首次调用add()方法时扩容至10。
List<String> list = new ArrayList<>(); // elementData = {} list.add("A"); // 首次扩容,容量变为10当第一次调用add方法时,会触发扩容逻辑,将容量初始化为 10,相关源码如下:
private int newCapacity(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity <= 0) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) return Math.max(DEFAULT_CAPACITY, minCapacity); if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return minCapacity; } return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity); }其中DEFAULT_CAPACITY的值为 10:
private static final int DEFAULT_CAPACITY = 10; 五、源码分析ArrayList扩容策略触发条件:当元素数量size超过数组长度elementData.length。
扩容规则:新容量为原容量的1.5倍(通过位运算优化:newCapacity = oldCapacity + (oldCapacity >> 1))。
扩容实现:调用Arrays.copyOf()创建新数组并拷贝原数据。
Java集合框架之ArrayList解析由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java集合框架之ArrayList解析”
上一篇
【微信小程序开发】元素顶部重叠
下一篇
通义灵码AI程序员