跳转至

Java 中如何实例化 ArrayList

简介

在 Java 编程里,ArrayList 是一个极为常用的动态数组实现类,它属于 Java 集合框架的一部分。ArrayList 能够灵活地调整大小,为存储和操作对象提供了便利。本文将详细阐述在 Java 中实例化 ArrayList 的相关知识,涵盖基础概念、使用方法、常见实践以及最佳实践,助力读者深入理解并高效运用 ArrayList

目录

  1. 基础概念
  2. 使用方法
    • 无参构造函数实例化
    • 带初始容量的构造函数实例化
    • 从其他集合实例化
  3. 常见实践
    • 存储自定义对象
    • 存储基本数据类型的包装类
  4. 最佳实践
    • 初始化时指定合适的容量
    • 使用泛型确保类型安全
  5. 小结
  6. 参考资料

基础概念

ArrayListjava.util 包中的一个类,它继承自 AbstractList 并实现了 List 接口。ArrayList 内部使用数组来存储元素,当元素数量超过数组容量时,会自动进行扩容操作。与传统数组不同,ArrayList 可以动态调整大小,无需预先指定固定的长度。

使用方法

无参构造函数实例化

使用无参构造函数实例化 ArrayList 时,会创建一个初始容量为 10 的空列表。

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

public class ArrayListExample {
    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 ArrayListWithCapacity {
    public static void main(String[] args) {
        // 带初始容量的构造函数实例化
        List<Integer> numbers = new ArrayList<>(20);
        for (int i = 0; i < 10; i++) {
            numbers.add(i);
        }
        System.out.println(numbers);
    }
}

从其他集合实例化

可以使用包含另一个集合作为参数的构造函数,将其他集合的元素复制到新的 ArrayList 中。

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

public class ArrayListFromCollection {
    public static void main(String[] args) {
        // 创建一个数组
        String[] array = {"cat", "dog", "bird"};
        // 将数组转换为列表
        List<String> originalList = Arrays.asList(array);
        // 从其他集合实例化
        List<String> newList = new ArrayList<>(originalList);
        System.out.println(newList);
    }
}

常见实践

存储自定义对象

ArrayList 可以存储自定义的对象,方便管理和操作这些对象。

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

// 定义一个自定义类
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 StoreCustomObjects {
    public static void main(String[] args) {
        // 实例化存储自定义对象的 ArrayList
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 30));
        for (Person person : people) {
            System.out.println(person);
        }
    }
}

存储基本数据类型的包装类

由于 ArrayList 只能存储对象,对于基本数据类型,需要使用对应的包装类。

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

public class StorePrimitiveWrappers {
    public static void main(String[] args) {
        // 存储基本数据类型的包装类
        List<Double> prices = new ArrayList<>();
        prices.add(19.99);
        prices.add(29.99);
        System.out.println(prices);
    }
}

最佳实践

初始化时指定合适的容量

若能预估列表的大致元素数量,在初始化时指定合适的容量,可减少扩容操作,提升性能。

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

public class OptimalCapacity {
    public static void main(String[] args) {
        // 预估元素数量并指定初始容量
        List<String> items = new ArrayList<>(50);
        for (int i = 0; i < 40; i++) {
            items.add("Item " + i);
        }
        System.out.println(items.size());
    }
}

使用泛型确保类型安全

使用泛型可以在编译时检查类型,避免运行时的 ClassCastException

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

public class GenericArrayList {
    public static void main(String[] args) {
        // 使用泛型确保类型安全
        List<Integer> scores = new ArrayList<>();
        scores.add(85);
        scores.add(90);
        // 编译时会检查类型
        // scores.add("not a number"); // 编译错误
        for (Integer score : scores) {
            System.out.println(score);
        }
    }
}

小结

本文全面介绍了在 Java 中实例化 ArrayList 的方法,包括无参构造函数、带初始容量的构造函数以及从其他集合实例化。同时,通过常见实践展示了如何存储自定义对象和基本数据类型的包装类。最后,给出了一些最佳实践建议,如初始化时指定合适的容量和使用泛型确保类型安全。希望读者能通过本文深入理解并高效运用 ArrayList

参考资料

  • 《Effective Java》(第三版),作者:Joshua Bloch