欢迎光临
我们一直在努力

手写 MyArrayList(新手友好版,模拟 JDK ArrayList 核心逻辑)

一、核心结论

你需要实现的 MyArrayList 是模拟 JDK 中 ArrayList 的核心功能 —— 基于动态扩容的数组实现,支持元素的增、删、改、查、遍历等基础操作,同时体现 ArrayList「查询快、增删慢、动态扩容」的核心特性。

下面的实现会保持极简(聚焦核心逻辑),同时注释详细,新手能轻松理解每一行代码的作用。


二、MyArrayList 完整实现

核心设计思路

  • 底层存储:用 Object[] 数组存储元素(支持任意引用类型);
  • 核心属性:
    • 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);

    赞(0)
    未经允许不得转载:171主机测评 » 手写 MyArrayList(新手友好版,模拟 JDK ArrayList 核心逻辑)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址