核心方法
使用 toArray() 方法(无参数)
这是最简单直接的方法,但它有一个重要的陷阱。

语法:
Object[] array = arrayList.toArray();
示例:
import java.util.ArrayList;
import java.util.List;
public class ArrayListToArrayExample {
public static void main(String[] args) {
// 1. 创建一个 ArrayList
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 2. 使用无参数的 toArray() 方法
Object[] nameArray = names.toArray();
// 3. 输出结果
System.out.println("转换后的数组类型: " + nameArray.getClass().getName()); // 输出 [Ljava.lang.Object;
System.out.println("数组内容: " + java.util.Arrays.toString(nameArray)); // 输出 [Alice, Bob, Charlie]
// 4. 重要:尝试使用 String 类型会编译错误!
// String[] stringArray = names.toArray(); // 编译错误: 不兼容的类型: Object[] 无法转换为 String[]
}
}
优点:
- 非常简单,一行代码即可完成。
缺点:

- 返回的是
Object[]数组,而不是ArrayList中元素的原始类型数组。 - 这意味着如果你有一个
ArrayList<String>,转换后的数组是Object[],不能直接赋值给String[]变量,会导致编译错误,这在需要特定类型数组时非常不方便。
使用 toArray(T[] array) 方法(推荐)
这是最常用也是最安全的方法,它允许你指定目标数组的类型,从而返回一个正确类型的数组。
语法:
// 创建一个与 ArrayList 大小相同、类型匹配的空数组作为参数 MyType[] myArray = myList.toArray(new MyType[0]); // 或者,如果元素数量不多,也可以创建一个固定大小的数组 MyType[] myArray = myList.toArray(new MyType[myList.size()]);
示例:
import java.util.ArrayList;
import java.util.List;
public class ArrayListToArrayGoodExample {
public static void main(String[] args) {
// 1. 创建一个 ArrayList
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 2. 使用 toArray(T[] array) 方法
// 传入一个空数组 new String[0] 是一种常见的、高效的写法
String[] nameArray = names.toArray(new String[0]);
// 3. 输出结果
System.out.println("转换后的数组类型: " + nameArray.getClass().getName()); // 输出 [Ljava.lang.String;
System.out.println("数组内容: " + java.util.Arrays.toString(nameArray)); // 输出 [Alice, Bob, Charlie]
// 4. 现在可以安全地使用 String[] 数组了
System.out.println("第一个名字是: " + nameArray[0]); // 输出 Alice
}
}
工作原理详解: 这个方法非常智能,它会根据你传入的数组参数来决定如何操作:

-
如果传入的数组长度
>=ArrayList的大小:ArrayList的元素会被复制到这个数组中。- 这个被传入的数组本身会被返回。
- 数组中多余的位置(如果传入的数组比
ArrayList大)会被设置为null。
示例:
String[] emptyArray = new String[5]; // 创建一个长度为5的空数组 String[] resultArray = names.toArray(emptyArray); // resultArray == emptyArray (它们是同一个数组对象) // resultArray 的内容将是: ["Alice", "Bob", "Charlie", null, null]
-
如果传入的数组长度
<ArrayList的大小:- 这个方法会自动创建一个与
ArrayList大小相同的新数组。 ArrayList的元素会被复制到这个新创建的数组中。- 这个新创建的数组会被返回。
示例:
String[] smallArray = new String[2]; // 创建一个长度为2的数组 String[] resultArray = names.toArray(smallArray); // smallArray 不会被使用和修改 // resultArray 是一个新创建的数组,长度为3 // resultArray 的内容将是: ["Alice", "Bob", "Charlie"] // resultArray.getClass() == smallArray.getClass() (类型相同)
- 这个方法会自动创建一个与
为什么推荐 new Type[0]?
names.toArray(new String[0]) 这种写法看起来有点反直觉(创建一个长度为0的数组),但它是最简洁和最高效的。
- 简洁性: 代码更短,意图更清晰(“我只需要一个正确类型的新数组,不在乎你用哪个数组来帮我创建”)。
- 效率: JVM 和 Java 集合框架对此有专门优化,传入一个长度为0的数组,JVM 会知道它必须创建一个新数组,避免了不必要的参数检查和潜在的数组复制操作,现代 JIT 编译器能很好地处理这种情况,性能与传入一个大小正确的数组几乎相同。
总结与最佳实践
| 特性 | toArray() (无参数) |
toArray(T[] array) (推荐) |
|---|---|---|
| 返回类型 | Object[] |
T[] (与 ArrayList 元素类型相同) |
| 类型安全 | 否,需要强制转换,且容易出错 | 是,编译器会进行类型检查 |
| 灵活性 | 低,只能得到 Object 数组 |
高,可以精确控制数组类型 |
| 推荐场景 | 当你确实只需要一个 Object[] 且不关心元素原始类型时 |
几乎在所有情况下都应使用此方法 |
在 99% 的情况下,你应该使用 toArray(T[] array) 方法,并推荐使用 new Type[0] 的形式。
// 最佳实践
List<String> stringList = new ArrayList<>(Arrays.asList("A", "B", "C"));
String[] stringArray = stringList.toArray(new String[0]);
List<Integer> intList = new ArrayList<>(Arrays.asList(1, 2, 3));
Integer[] intArray = intList.toArray(new Integer[0]); 