核心方法
使用 toArray(T[] a) - 推荐
这是最常用、最灵活也是最安全的方法,它允许你指定数组的类型和大小。

语法:
<T> T[] toArray(T[] a)
- 参数: 一个与你
ArrayList中元素类型相同的数组。 - 返回值: 一个包含
ArrayList所有元素的数组。
工作原理:
- 如果传入的数组长度足够大(
a.length >= size()),ArrayList的元素会被复制到这个数组中,然后返回这个传入的数组。 - 如果传入的数组长度不够(
a.length < size()),或者传入的数组是null,ArrayList会创建一个全新的数组,其类型和长度都恰好能容纳所有元素,然后返回这个新数组。
示例代码
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListToArray {
public static void main(String[] args) {
// 1. 准备一个 ArrayList
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// --- 情况一:传入一个长度足够的空数组 ---
// 创建一个与 ArrayList 元素类型相同,长度足够的数组
String[] nameArray1 = new String[names.size()];
// 调用 toArray 方法
String[] result1 = names.toArray(nameArray1);
// 验证:返回的是传入的数组本身
System.out.println("情况一 - 是否为同一个数组: " + (result1 == nameArray1)); // 输出 true
System.out.println("情况一 - 结果数组: " + Arrays.toString(result1));
// 输出: 情况一 - 结果数组: [Alice, Bob, Charlie]
System.out.println("--------------------");
// --- 情况二:传入一个长度不足的数组 ---
String[] nameArray2 = new String[1]; // 长度只有 1
String[] result2 = names.toArray(nameArray2);
// 验证:返回的是一个新的数组
System.out.println("情况二 - 是否为同一个数组: " + (result2 == nameArray2)); // 输出 false
System.out.println("情况二 - 原始数组内容: " + Arrays.toString(nameArray2)); // 原数组第一个元素被填充,其余为 null
System.out.println("情况二 - 结果数组: " + Arrays.toString(result2));
// 输出: 情况二 - 结果数组: [Alice, Bob, Charlie]
System.out.println("--------------------");
// --- 情况三:传入一个 null 数组 ---
// 这是推荐的、最简洁的写法,因为它自动处理了所有情况
String[] result3 = names.toArray(new String[0]);
System.out.println("情况三 - 结果数组: " + Arrays.toString(result3));
// 输出: 情况三 - 结果数组: [Alice, Bob, Charlie]
}
}
为什么推荐 new String[0]?
将一个长度为 0 的数组作为参数传递给 toArray() 是一种非常普遍的实践,因为它的长度肯定小于 ArrayList 的 size(),ArrayList 会为你创建一个全新的、大小正好的数组,这种写法简洁明了,并且总是能正确工作。
使用 toArray() - 不推荐(除非有特殊需求)
这个方法不带参数,返回一个 Object 类型的数组。

语法:
Object[] toArray()
示例代码:
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListToObjectArray {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
// 返回一个 Object[] 数组
Object[] objectArray = names.toArray();
System.out.println("Object[] 数组内容: " + Arrays.toString(objectArray));
// 输出: Object[] 数组内容: [Alice, Bob]
// 缺点:数组类型是 Object,不能直接用于需要 String[] 的地方
// 下面这行代码会编译失败,因为类型不匹配
// String[] stringArray = objectArray;
}
}
缺点:
- 返回的数组是
Object[]类型,而不是你原始的泛型类型(如String[])。 - 这会导致类型不安全,如果你试图将它赋值给一个特定类型的数组引用,编译器会报错。
- 你需要进行强制类型转换,这可能会在运行时抛出
ClassCastException(虽然在这个简单例子中不会,但在更复杂的泛型场景下可能会)。
除非你确实需要一个 Object[] 数组,否则应该优先使用方法一。

需要注意的陷阱:基本数据类型
ArrayList 是一个泛型类,不能直接存储基本数据类型(如 int, double, char),只能存储它们的包装类(如 Integer, Double, Character)。
当你将 ArrayList<Integer> 转换为数组时,你得到的是 Integer[],而不是 int[],如果你需要一个 int[] 数组,必须手动进行转换。
示例:从 ArrayList<Integer> 到 int[]
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListPrimitiveArray {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
// 第一步:将 ArrayList<Integer> 转换为 Integer[]
Integer[] integerArray = numbers.toArray(new Integer[0]);
System.out.println("Integer[] 数组: " + Arrays.toString(integerArray)); // [10, 20, 30]
// 第二步:手动将 Integer[] 转换为 int[]
// 创建一个与 Integer[] 长度相同的 int[] 数组
int[] intArray = new int[integerArray.length];
// 遍历并逐个转换
for (int i = 0; i < integerArray.length; i++) {
intArray[i] = integerArray[i]; // 自动拆箱 (unboxing)
}
System.out.println("int[] 数组: " + Arrays.toString(intArray)); // [10, 20, 30]
}
}
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
对象类型 (String, User 等) |
list.toArray(new T[0]) |
类型安全、简洁、高效 | 无 |
需要 Object[] |
list.toArray() |
直接返回 Object[] |
类型不安全,不推荐常规使用 |
基本数据类型 (int, double) |
list.toArray(new Integer[0]) + 手动转换 |
正确的转换路径 | 需要额外的循环和手动转换步骤 |
最佳实践:
对于绝大多数情况,使用 yourList.toArray(new YourType[0]) 是将 ArrayList 转换为数组的最佳方式,它既安全又简洁。
