Java 中如何实例化 ArrayList
简介
在 Java 编程里,ArrayList
是一个极为常用的动态数组实现类,它属于 Java 集合框架的一部分。ArrayList
能够灵活地调整大小,为存储和操作对象提供了便利。本文将详细阐述在 Java 中实例化 ArrayList
的相关知识,涵盖基础概念、使用方法、常见实践以及最佳实践,助力读者深入理解并高效运用 ArrayList
。
目录
- 基础概念
- 使用方法
- 无参构造函数实例化
- 带初始容量的构造函数实例化
- 从其他集合实例化
- 常见实践
- 存储自定义对象
- 存储基本数据类型的包装类
- 最佳实践
- 初始化时指定合适的容量
- 使用泛型确保类型安全
- 小结
- 参考资料
基础概念
ArrayList
是 java.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