跳转至

Java 中初始化 ArrayList 的全面指南

简介

在 Java 编程里,ArrayList 是一个非常常用的动态数组实现类,它属于 Java 集合框架的一部分。ArrayList 允许我们存储和操作一系列对象,并且可以根据需要动态调整大小。本文将围绕 Java 中初始化 ArrayList 的相关内容展开,详细介绍其基础概念、使用方法、常见实践以及最佳实践,帮助读者更深入地理解并高效运用 ArrayList 初始化操作。

目录

  1. 基础概念
  2. 使用方法
    • 无参构造函数初始化
    • 带初始容量的构造函数初始化
    • 使用 Arrays.asList() 方法初始化
    • 使用静态工厂方法初始化
    • 使用匿名内部类初始化
  3. 常见实践
    • 初始化空列表用于后续添加元素
    • 初始化包含固定元素的列表
  4. 最佳实践
    • 避免不必要的初始容量设置
    • 优先使用静态工厂方法
    • 考虑性能和内存使用
  5. 小结
  6. 参考资料

基础概念

ArrayListjava.util 包下的一个类,它继承自 AbstractList 类并实现了 List 接口。与普通数组不同,ArrayList 的大小是可变的,它会自动处理元素的添加和删除,并且可以根据需要动态调整内部数组的大小。初始化 ArrayList 就是为这个动态数组分配内存空间,并可以选择预先添加一些初始元素。

使用方法

无参构造函数初始化

使用无参构造函数创建一个空的 ArrayList,后续可以通过 add() 方法添加元素。

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

public class ArrayListInitialization {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        System.out.println(list);
    }
}

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

如果你预先知道列表大致需要存储的元素数量,可以使用带初始容量的构造函数来提高性能,减少内部数组扩容的次数。

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

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

使用 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> fixedList = Arrays.asList("red", "green", "blue");
        List<String> list = new ArrayList<>(fixedList);
        list.add("yellow");
        System.out.println(list);
    }
}

使用静态工厂方法初始化

Java 9 及以上版本提供了 List.of() 静态工厂方法,可以方便地创建不可变列表,然后再将其转换为 ArrayList

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

public class ArrayListInitializationWithListOf {
    public static void main(String[] args) {
        List<String> immutableList = List.of("cat", "dog", "bird");
        List<String> list = new ArrayList<>(immutableList);
        System.out.println(list);
    }
}

使用匿名内部类初始化

可以使用匿名内部类的方式在初始化时直接添加元素。

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

public class ArrayListInitializationWithAnonymousClass {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>() {{
            add("one");
            add("two");
            add("three");
        }};
        System.out.println(list);
    }
}

常见实践

初始化空列表用于后续添加元素

在很多情况下,我们可能不知道列表最终会包含哪些元素,或者元素是动态生成的,这时可以先初始化一个空的 ArrayList,然后在程序运行过程中根据需要添加元素。

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

public class InitializeEmptyList {
    public static void main(String[] args) {
        List<Integer> randomNumbers = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 5; i++) {
            randomNumbers.add(random.nextInt(100));
        }
        System.out.println(randomNumbers);
    }
}

初始化包含固定元素的列表

当我们知道列表需要包含哪些固定元素时,可以使用前面介绍的方法之一来初始化列表。

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

public class InitializeListWithFixedElements {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>(List.of("strawberry", "grape", "lemon"));
        System.out.println(fruits);
    }
}

最佳实践

避免不必要的初始容量设置

虽然带初始容量的构造函数可以提高性能,但如果设置的初始容量过大,会浪费内存。因此,只有在确实知道大致元素数量时才使用该方法。

优先使用静态工厂方法

对于 Java 9 及以上版本,优先使用 List.of() 方法创建不可变列表,然后再转换为 ArrayList,因为这种方式代码更简洁,且创建的不可变列表在安全性和性能上有一定优势。

考虑性能和内存使用

在选择初始化方法时,要综合考虑性能和内存使用。例如,使用匿名内部类初始化虽然代码简洁,但可能会导致一些额外的性能开销,因为它会创建一个匿名子类。

小结

本文详细介绍了 Java 中初始化 ArrayList 的多种方法,包括无参构造函数、带初始容量的构造函数、Arrays.asList() 方法、静态工厂方法和匿名内部类等。同时,阐述了常见的初始化实践场景,并给出了一些最佳实践建议。通过合理选择初始化方法,可以提高代码的性能和可读性,避免不必要的内存浪费。

参考资料

  1. 《Effective Java》(第三版),作者:Joshua Bloch
  2. 《Java 核心技术》(卷 I),作者:Cay S. Horstmann