跳转至

Java 中如何创建 ArrayList

简介

在 Java 编程中,ArrayList 是一个非常常用的集合类。它提供了一种动态数组的实现,允许我们方便地添加、删除和访问元素。了解如何创建 ArrayList 是使用它进行高效编程的基础。本文将详细介绍在 Java 中创建 ArrayList 的基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
  2. 使用方法
    • 基本创建
    • 创建指定初始容量的 ArrayList
    • 从现有集合创建 ArrayList
  3. 常见实践
    • 存储不同类型数据
    • 与泛型结合使用
  4. 最佳实践
    • 合理设置初始容量
    • 避免不必要的装箱和拆箱
  5. 小结
  6. 参考资料

基础概念

ArrayList 是 Java 集合框架中的一部分,它实现了 List 接口。与普通数组不同,ArrayList 的大小是可以动态变化的。这意味着我们不需要事先知道要存储多少个元素,可以在运行时根据需要添加或删除元素。ArrayList 内部是通过数组来实现的,但它提供了更丰富的方法来操作数据,例如 add()remove()get() 等。

使用方法

基本创建

创建一个空的 ArrayList 非常简单,只需要使用以下语法:

import java.util.ArrayList;

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

在这个例子中,我们创建了一个类型为 StringArrayList。尖括号 <> 中的类型参数指定了 ArrayList 中可以存储的元素类型。这里我们选择了 String,表示这个 ArrayList 只能存储字符串。

创建指定初始容量的 ArrayList

如果我们事先大致知道需要存储的元素数量,可以在创建 ArrayList 时指定初始容量,这样可以提高性能,减少内部数组的扩容次数。语法如下:

import java.util.ArrayList;

public class ArrayListInitialCapacityExample {
    public static void main(String[] args) {
        // 创建一个初始容量为 10 的 ArrayList
        ArrayList<Integer> list = new ArrayList<>(10);
    }
}

在这个例子中,我们创建了一个初始容量为 10 的 ArrayList,用于存储 Integer 类型的元素。

从现有集合创建 ArrayList

我们还可以从现有的集合创建 ArrayList。例如,我们有一个 HashSet,可以将其元素转换为 ArrayList

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class ArrayListFromCollectionExample {
    public static void main(String[] args) {
        // 创建一个 HashSet
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("cherry");

        // 从 HashSet 创建 ArrayList
        ArrayList<String> list = new ArrayList<>(set);
        System.out.println(list);
    }
}

在这个例子中,我们首先创建了一个 HashSet,并添加了一些元素。然后,我们使用 HashSet 创建了一个 ArrayList,新的 ArrayList 包含了 HashSet 中的所有元素。

常见实践

存储不同类型数据

ArrayList 可以存储各种类型的数据,只要在创建时指定相应的类型参数即可。例如,存储自定义对象:

import java.util.ArrayList;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ArrayListCustomObjectExample {
    public static void main(String[] args) {
        // 创建一个存储 Person 对象的 ArrayList
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("Alice", 25));
        list.add(new Person("Bob", 30));
        System.out.println(list);
    }
}

在这个例子中,我们定义了一个 Person 类,并创建了一个存储 Person 对象的 ArrayList

与泛型结合使用

泛型是 Java 5.0 引入的一个重要特性,它允许我们在编译时检查类型安全。在使用 ArrayList 时,与泛型结合使用可以避免运行时的类型错误。例如:

import java.util.ArrayList;

public class ArrayListGenericsExample {
    public static void main(String[] args) {
        // 创建一个存储 Integer 类型的 ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        // 以下代码会在编译时出错,因为 list 只能存储 Integer 类型
        // list.add("not an integer");
    }
}

在这个例子中,由于我们指定了 ArrayList 存储 Integer 类型的元素,所以在编译时如果尝试添加非 Integer 类型的元素,编译器会报错,从而提高了代码的健壮性。

最佳实践

合理设置初始容量

如前文所述,合理设置初始容量可以减少 ArrayList 内部数组的扩容次数,提高性能。例如,如果我们要存储大量数据,事先知道大概的数量,设置合适的初始容量可以避免频繁的扩容操作。假设我们要存储 1000 个元素:

import java.util.ArrayList;

public class ArrayListOptimalCapacityExample {
    public static void main(String[] args) {
        // 合理设置初始容量为 1000
        ArrayList<String> list = new ArrayList<>(1000);
        for (int i = 0; i < 1000; i++) {
            list.add("element " + i);
        }
    }
}

避免不必要的装箱和拆箱

在 Java 中,基本数据类型(如 intdouble 等)和包装类(如 IntegerDouble 等)之间存在装箱和拆箱的过程。当我们在 ArrayList 中存储基本数据类型时,会自动进行装箱操作,读取时会进行拆箱操作。过多的装箱和拆箱操作会影响性能。从 Java 9 开始,java.util 包中引入了一些原始类型特化的集合,如 IntArrayListDoubleArrayList 等,可以避免装箱和拆箱操作。例如:

import org.apache.commons.collections4.list.IntArrayList;

public class AvoidBoxingUnboxingExample {
    public static void main(String[] args) {
        // 使用原始类型特化的集合 IntArrayList
        IntArrayList list = new IntArrayList();
        list.add(10);
        list.add(20);
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += list.getInt(i);
        }
        System.out.println("Sum: " + sum);
    }
}

在这个例子中,我们使用了 IntArrayList 来存储整数,避免了装箱和拆箱操作,提高了性能。

小结

本文详细介绍了在 Java 中创建 ArrayList 的方法,包括基本创建、创建指定初始容量的 ArrayList 以及从现有集合创建 ArrayList。同时,我们还探讨了一些常见实践,如存储不同类型数据和与泛型结合使用。在最佳实践方面,合理设置初始容量和避免不必要的装箱和拆箱可以提高程序的性能。通过掌握这些知识,读者可以更深入地理解并高效使用 ArrayList 进行 Java 编程。

参考资料