一、核心结论
你需要实现的 MyArrayList 是模拟 JDK 中 ArrayList 的核心功能 —— 基于动态扩容的数组实现,支持元素的增、删、改、查、遍历等基础操作,同时体现 ArrayList「查询快、增删慢、动态扩容」的核心特性。
下面的实现会保持极简(聚焦核心逻辑),同时注释详细,新手能轻松理解每一行代码的作用。
二、MyArrayList 完整实现
核心设计思路
- elementData:存储元素的数组;
- size:当前集合中元素的个数(≠ 数组长度);
- DEFAULT_CAPACITY:默认初始容量(10,和 JDK 一致);
- 构造方法(空参 / 指定容量);
- 增(add)、删(remove)、改(set)、查(get);
- 扩容机制(数组满时自动扩容为 1.5 倍);
- 辅助方法(判空、清空、获取长度)。
java
运行
import java.util.Arrays;
/**
* 模拟 JDK ArrayList 实现核心功能
* 支持任意引用类型,实现动态扩容、增删改查等基础操作
*/
public class MyArrayList {
// 1. 核心属性
// 默认初始容量(和 JDK ArrayList 一致)
private static final int DEFAULT_CAPACITY = 10;
// 空数组(用于空参构造)
private static final Object[] EMPTY_ELEMENT_DATA = {};
// 存储元素的底层数组
private Object[] elementData;
// 当前集合中元素的个数(不是数组长度)
private int size;
// 2. 构造方法
/**
* 空参构造:初始化为空数组,第一次添加元素时扩容为默认容量 10
*/
public MyArrayList() {
this.elementData = EMPTY_ELEMENT_DATA;
}
/**
* 指定初始容量的构造方法
* @param initialCapacity 初始容量
* @throws IllegalArgumentException 容量为负数时抛异常
*/
public MyArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENT_DATA;
} else {
throw new IllegalArgumentException(\”初始容量不能为负数: \” + initialCapacity);
}
}
// 3. 核心方法:增
/**
* 尾部添加元素
* @param e 要添加的元素
* @return 始终返回 true(模拟 ArrayList 的 add 方法)
*/
public boolean add(Object e) {
// 先检查容量,不够则扩容
ensureCapacityInternal(size + 1);
// 元素放入数组尾部,size 自增
elementData[size++] = e;
return true;
}
/**
* 指定索引位置添加元素
* @param index 要插入的索引
* @param e 要添加的元素
* @throws IndexOutOfBoundsException 索引越界时抛异常
*/
public void add(int index, Object e) {
// 检查索引是否合法(0 ≤ index ≤ size)
checkIndexForAdd(index);
// 检查容量,不够则扩容
ensureCapacityInternal(size + 1);
// 数组拷贝:将 index 及之后的元素向后移动一位(腾出位置)
System.arraycopy(elementData, index, elementData, index + 1, size – index);



