数据结构:ArrayList 底层实现探索

举报
鱼弦 发表于 2025/01/16 11:53:45 2025/01/16
【摘要】 数据结构:ArrayList 底层实现探索ArrayList 是 Java 中最常用的动态数组实现,基于数组实现,支持动态扩容和随机访问。它提供了高效的增删改查操作,是 Java 集合框架的核心组件之一。 应用场景数据存储:用于存储和管理大量数据。动态数组:用于需要动态调整大小的数组场景。缓存:用于实现缓存数据结构。算法实现:用于实现各种算法(如排序、查找)。 原理解释 ArrayList...

数据结构:ArrayList 底层实现探索

ArrayList 是 Java 中最常用的动态数组实现,基于数组实现,支持动态扩容和随机访问。它提供了高效的增删改查操作,是 Java 集合框架的核心组件之一。

应用场景

  1. 数据存储:用于存储和管理大量数据。
  2. 动态数组:用于需要动态调整大小的数组场景。
  3. 缓存:用于实现缓存数据结构。
  4. 算法实现:用于实现各种算法(如排序、查找)。

原理解释

ArrayList 的核心思想

  1. 基于数组ArrayList 内部使用数组存储元素。
  2. 动态扩容:当数组容量不足时,自动扩容(通常为原容量的 1.5 倍)。
  3. 随机访问:通过索引直接访问元素,时间复杂度为 O(1)。
  4. 增删操作:在末尾添加元素的时间复杂度为 O(1),在中间插入或删除元素的时间复杂度为 O(n)。

ArrayList 的核心方法

  1. add(E e):在列表末尾添加元素。
  2. remove(int index):删除指定位置的元素。
  3. get(int index):获取指定位置的元素。
  4. set(int index, E element):设置指定位置的元素。

算法原理流程图

开始
  |
  v
初始化数组(默认容量为 10|
  v
添加元素
  |
  v
检查数组容量是否足够
  |
  v
是 --> 直接添加元素
  |               ||
  v
扩容数组(通常为原容量的 1.5 倍)
  |
  v
添加元素
  |
  v
结束

详细代码实现

以下是一个简化版的 ArrayList 实现,展示其核心功能。

1. 自定义 ArrayList 实现

public class MyArrayList<E> {
    private static final int DEFAULT_CAPACITY = 10; // 默认容量
    private Object[] elements; // 存储元素的数组
    private int size; // 当前元素数量

    // 构造函数
    public MyArrayList() {
        elements = new Object[DEFAULT_CAPACITY];
        size = 0;
    }

    // 添加元素
    public void add(E e) {
        ensureCapacity(size + 1); // 确保容量足够
        elements[size++] = e; // 添加元素
    }

    // 获取元素
    @SuppressWarnings("unchecked")
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return (E) elements[index];
    }

    // 设置元素
    public void set(int index, E element) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        elements[index] = element;
    }

    // 删除元素
    @SuppressWarnings("unchecked")
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        E oldValue = (E) elements[index];
        int numMoved = size - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elements, index + 1, elements, index, numMoved);
        }
        elements[--size] = null; // 清除引用,帮助垃圾回收
        return oldValue;
    }

    // 确保容量足够
    private void ensureCapacity(int minCapacity) {
        if (minCapacity > elements.length) {
            int newCapacity = elements.length + (elements.length >> 1); // 扩容 1.5 倍
            if (newCapacity < minCapacity) {
                newCapacity = minCapacity;
            }
            elements = Arrays.copyOf(elements, newCapacity);
        }
    }

    // 获取当前元素数量
    public int size() {
        return size;
    }

    // 打印列表内容
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            sb.append(elements[i]);
            if (i < size - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

2. 测试自定义 ArrayList

public class MyArrayListTest {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();

        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        System.out.println("After adding elements: " + list);

        // 获取元素
        System.out.println("Element at index 1: " + list.get(1));

        // 设置元素
        list.set(1, "Blueberry");
        System.out.println("After setting element at index 1: " + list);

        // 删除元素
        list.remove(0);
        System.out.println("After removing element at index 0: " + list);

        // 打印列表大小
        System.out.println("List size: " + list.size());
    }
}

测试步骤

  1. 创建自定义 ArrayList:运行 MyArrayList 类。
  2. 添加元素:调用 add 方法添加元素。
  3. 获取元素:调用 get 方法获取元素。
  4. 设置元素:调用 set 方法设置元素。
  5. 删除元素:调用 remove 方法删除元素。
  6. 打印结果:观察输出结果,验证功能是否正确。

部署场景

ArrayList 可以部署在以下场景中:

  1. 数据存储:用于存储和管理大量数据。
  2. 动态数组:用于需要动态调整大小的数组场景。
  3. 缓存:用于实现缓存数据结构。
  4. 算法实现:用于实现各种算法(如排序、查找)。

材料链接


总结

本文介绍了 ArrayList 的底层实现原理,并提供了一个简化版的自定义 ArrayList 实现。通过理解 ArrayList 的核心思想和实现细节,可以更好地应用和优化这一数据结构。


未来展望

未来,ArrayList 可以结合以下技术进一步提升性能和应用范围:

  1. 并发支持:实现线程安全的 ArrayList(如 CopyOnWriteArrayList)。
  2. 内存优化:通过压缩或分块存储优化内存使用。
  3. 持久化存储:结合数据库或文件系统实现持久化存储。
  4. 高级功能:支持更多高级功能(如排序、过滤、映射)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。