跳转至

Java ArrayList 初始化全解析

简介

在 Java 编程中,ArrayList 是一个非常常用的动态数组实现类,它位于 java.util 包下。ArrayList 可以动态地调整大小,允许存储任意数量的元素。本文将详细介绍 Java ArrayList 初始化的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用 ArrayList 的初始化操作。

目录

  1. 基础概念
  2. 使用方法
    • 无参构造函数初始化
    • 带初始容量的构造函数初始化
    • 使用另一个集合初始化
  3. 常见实践
    • 初始化时添加元素
    • 初始化空列表后添加元素
  4. 最佳实践
    • 预估容量以减少扩容开销
    • 使用 Arrays.asList() 初始化
    • 使用 Java 8 Stream 初始化
  5. 小结
  6. 参考资料

基础概念

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

初始化 ArrayList 就是为其分配内存空间,并可以选择在初始化时添加一些初始元素。根据不同的需求,可以选择不同的初始化方式。

使用方法

无参构造函数初始化

使用无参构造函数创建一个空的 ArrayList,初始容量为默认值(通常是 10)。

import java.util.ArrayList;
import java.util.List;

public class ArrayListInitializationExample {
    public static void main(String[] args) {
        // 使用无参构造函数初始化
        List<String> list = new ArrayList<>();
        System.out.println("List size after initialization: " + list.size());
    }
}

在上述代码中,我们使用无参构造函数创建了一个 ArrayList 对象 list,并打印了初始化后的列表大小,结果为 0。

带初始容量的构造函数初始化

如果已经知道要存储的元素数量,可以使用带初始容量的构造函数来创建 ArrayList,这样可以避免不必要的扩容操作,提高性能。

import java.util.ArrayList;
import java.util.List;

public class ArrayListInitializationWithCapacity {
    public static void main(String[] args) {
        // 使用带初始容量的构造函数初始化
        List<Integer> list = new ArrayList<>(20);
        System.out.println("Initial capacity of the list: " + ((ArrayList<Integer>) list).capacity());
    }
}

在上述代码中,我们使用带初始容量 20 的构造函数创建了一个 ArrayList 对象 list,并打印了其初始容量。

使用另一个集合初始化

可以使用另一个集合来初始化 ArrayList,这样会将另一个集合中的所有元素复制到新的 ArrayList 中。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayListInitializationWithAnotherCollection {
    public static void main(String[] args) {
        // 创建一个包含一些元素的列表
        List<String> sourceList = Arrays.asList("apple", "banana", "cherry");
        // 使用另一个集合初始化 ArrayList
        List<String> list = new ArrayList<>(sourceList);
        System.out.println("List elements: " + list);
    }
}

在上述代码中,我们先使用 Arrays.asList() 方法创建了一个包含三个元素的列表 sourceList,然后使用这个列表来初始化另一个 ArrayList 对象 list,最后打印了 list 中的元素。

常见实践

初始化时添加元素

可以在初始化 ArrayList 后立即添加元素。

import java.util.ArrayList;
import java.util.List;

public class ArrayListInitializationAndAddingElements {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("dog");
        list.add("cat");
        list.add("bird");
        System.out.println("List elements: " + list);
    }
}

在上述代码中,我们先创建了一个空的 ArrayList 对象 list,然后使用 add() 方法向列表中添加了三个元素,并打印了列表中的元素。

初始化空列表后添加元素

有时候可能需要先创建一个空的 ArrayList,然后在后续的代码中根据条件添加元素。

import java.util.ArrayList;
import java.util.List;

public class ArrayListInitializationEmptyAndAddingLater {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(i);
        }
        System.out.println("List elements: " + list);
    }
}

在上述代码中,我们先创建了一个空的 ArrayList 对象 list,然后使用 for 循环向列表中添加了 0 到 4 的整数,并打印了列表中的元素。

最佳实践

预估容量以减少扩容开销

如果能够预估要存储的元素数量,建议使用带初始容量的构造函数来初始化 ArrayList,以减少扩容操作带来的性能开销。

import java.util.ArrayList;
import java.util.List;

public class ArrayListInitializationWithEstimatedCapacity {
    public static void main(String[] args) {
        int estimatedSize = 100;
        List<String> list = new ArrayList<>(estimatedSize);
        for (int i = 0; i < estimatedSize; i++) {
            list.add("Element " + i);
        }
        System.out.println("List size: " + list.size());
    }
}

在上述代码中,我们预估要存储 100 个元素,因此使用带初始容量 100 的构造函数来初始化 ArrayList,然后使用 for 循环向列表中添加元素。

使用 Arrays.asList() 初始化

Arrays.asList() 方法可以方便地创建一个包含多个元素的列表,然后可以使用这个列表来初始化 ArrayList

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayListInitializationWithArraysAsList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("red", "green", "blue"));
        System.out.println("List elements: " + list);
    }
}

在上述代码中,我们使用 Arrays.asList() 方法创建了一个包含三个元素的列表,然后使用这个列表来初始化 ArrayList,并打印了列表中的元素。

使用 Java 8 Stream 初始化

Java 8 引入的 Stream API 可以方便地生成元素序列,并将其收集到 ArrayList 中。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ArrayListInitializationWithStream {
    public static void main(String[] args) {
        List<Integer> list = IntStream.range(1, 6)
               .boxed()
               .collect(Collectors.toCollection(ArrayList::new));
        System.out.println("List elements: " + list);
    }
}

在上述代码中,我们使用 IntStream.range() 方法生成了一个从 1 到 5 的整数序列,然后使用 boxed() 方法将 int 类型转换为 Integer 类型,最后使用 collect() 方法将元素收集到 ArrayList 中,并打印了列表中的元素。

小结

本文详细介绍了 Java ArrayList 初始化的基础概念、使用方法、常见实践以及最佳实践。在初始化 ArrayList 时,可以根据不同的需求选择合适的初始化方式。如果知道要存储的元素数量,建议使用带初始容量的构造函数来减少扩容开销;如果需要快速创建包含多个元素的列表,可以使用 Arrays.asList() 方法;如果使用 Java 8 及以上版本,还可以使用 Stream API 来初始化 ArrayList。通过合理使用这些初始化方法,可以提高代码的性能和可读性。

参考资料

  1. 《Effective Java》,作者:Joshua Bloch