跳转至

深入剖析 ArrayList Java 源码

简介

在 Java 编程中,ArrayList 是一个非常常用的动态数组实现类,它位于 java.util 包下。ArrayList 提供了一种方便的方式来存储和操作对象集合,它可以根据需要自动调整大小。本文将深入探讨 ArrayList 的基础概念、使用方法、常见实践以及最佳实践,通过对其源码的分析,帮助读者更好地理解和高效使用 ArrayList

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

什么是 ArrayList

ArrayList 是 Java 集合框架中的一个类,它实现了 List 接口,底层使用数组来存储元素。与普通数组不同的是,ArrayList 可以动态地调整大小,当元素数量超过数组的容量时,会自动进行扩容操作。

源码关键属性

以下是 ArrayList 源码中的一些关键属性:

// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;
// 用于空实例的共享空数组实例
private static final Object[] EMPTY_ELEMENTDATA = {};
// 用于默认大小的空实例的共享空数组实例
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 存储 ArrayList 元素的数组缓冲区
transient Object[] elementData; 
// ArrayList 的大小(包含的元素个数)
private int size;

使用方法

创建 ArrayList 对象

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建一个空的 ArrayList
        ArrayList<String> list1 = new ArrayList<>();

        // 创建一个初始容量为 20 的 ArrayList
        ArrayList<Integer> list2 = new ArrayList<>(20);
    }
}

添加元素

import java.util.ArrayList;

public class ArrayListAddExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        // 添加单个元素
        list.add("apple");
        list.add("banana");

        // 在指定位置添加元素
        list.add(1, "cherry");
        System.out.println(list); // 输出: [apple, cherry, banana]
    }
}

获取元素

import java.util.ArrayList;

public class ArrayListGetExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // 获取指定位置的元素
        String element = list.get(0);
        System.out.println(element); // 输出: apple
    }
}

修改元素

import java.util.ArrayList;

public class ArrayListSetExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // 修改指定位置的元素
        list.set(0, "cherry");
        System.out.println(list); // 输出: [cherry, banana]
    }
}

删除元素

import java.util.ArrayList;

public class ArrayListRemoveExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // 删除指定位置的元素
        list.remove(0);
        System.out.println(list); // 输出: [banana]
    }
}

常见实践

遍历 ArrayList

import java.util.ArrayList;

public class ArrayListTraversalExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // 使用 for 循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        // 使用增强 for 循环遍历
        for (String element : list) {
            System.out.println(element);
        }

        // 使用迭代器遍历
        java.util.Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

排序 ArrayList

import java.util.ArrayList;
import java.util.Collections;

public class ArrayListSortExample {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(2);

        // 对 ArrayList 进行排序
        Collections.sort(list);
        System.out.println(list); // 输出: [1, 2, 3]
    }
}

最佳实践

初始化时指定容量

如果预先知道 ArrayList 要存储的元素数量,建议在创建时指定初始容量,这样可以减少扩容的次数,提高性能。

import java.util.ArrayList;

public class ArrayListInitialCapacityExample {
    public static void main(String[] args) {
        // 假设要存储 100 个元素
        ArrayList<Integer> list = new ArrayList<>(100);
    }
}

使用泛型

使用泛型可以确保 ArrayList 中只存储特定类型的元素,提高代码的安全性和可读性。

import java.util.ArrayList;

public class ArrayListGenericExample {
    public static void main(String[] args) {
        // 只存储 String 类型的元素
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        // 以下代码会编译错误,因为只能存储 String 类型
        // list.add(1); 
    }
}

及时清理不再使用的元素

ArrayList 中的元素不再使用时,及时调用 remove 方法将其移除,避免占用过多的内存。

小结

本文深入介绍了 ArrayList 的基础概念、使用方法、常见实践以及最佳实践。通过对 ArrayList 源码的分析,我们了解到它底层使用数组存储元素,并且可以动态调整大小。在使用 ArrayList 时,我们可以根据不同的需求选择合适的方法来添加、获取、修改和删除元素。同时,遵循最佳实践可以提高代码的性能和安全性。

参考资料

  1. 《Effective Java》
  2. 《Java 核心技术》