Java 集合框架:ArrayList 的介绍、使用、原理与源码解析

一、ArrayList 的介绍

ArrayList 是 Java 集合框架中的一个动态数组实现,提供了可变大小的数组。它能够存储重复的元素并允许快速随机访问。与原始数组不同,ArrayList 可以动态扩展,允许在运行时在列表中添加或删除元素。

ArrayList 实现了 List 接口,常用的构造函数包括: - ArrayList():创建一个空的列表,初始容量为 10。 - ArrayList(int initialCapacity):创建一个空的列表,指定初始容量。 - ArrayList(Collection<? extends E> c):创建一个包含指定集合元素的列表。

二、ArrayList 的使用

使用 ArrayList 非常简单,以下是一个基本示例:

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建 ArrayList
        ArrayList<String> list = new ArrayList<>();

        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 打印列表
        System.out.println("初始列表: " + list);

        // 插入元素
        list.add(1, "Orange");
        System.out.println("插入后的列表: " + list);

        // 获取元素
        String fruit = list.get(2);
        System.out.println("索引 2 的元素: " + fruit);

        // 删除元素
        list.remove("Banana");
        System.out.println("删除后的列表: " + list);

        // 遍历列表
        for (String item : list) {
            System.out.println(item);
        }
    }
}

三、原理分析

ArrayList 的底层是一个数组,通过维护一个 Object 数组来存储元素。默认情况下,ArrayList 的初始容量为 10,当元素数量超过当前容量时,会自动扩展。

扩容的过程是通过创建一个新的更大的数组,并将原有数组的数据复制到新数组中,具体实现方式常见的是在原来的容量基础上乘以 1.5。

当我们向 ArrayList 添加元素时,如果当前数组已满,扩容操作的性能成本是 O(n)。

四、源码解析

ArrayList 的主要源码部分可以在 java.util.ArrayList 类中找到。这是它的核心属性:

transient Object[] elementData; // 存储元素的数组
private int size; // 存储元素的个数

当添加元素时,ArrayList 会检查 size 是否已达到 elementData 的长度:

public boolean add(E e) {
    ensureCapacity(size + 1); // 确保容量
    elementData[size++] = e; // 添加元素并更新 size
    return true;
}

ensureCapacity 方法会调用如下:

private void ensureCapacity(int minCapacity) {
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5 倍扩容
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    elementData = Arrays.copyOf(elementData, newCapacity);
}

结论

ArrayList 是 Java 中使用最广泛的集合类之一。它通过动态数组提供了灵活的存储方式,适用于频繁的插入和删除操作。了解其实现原理和源码,能够帮助开发者在选择合适的数据结构时做出明智的决策。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部