| 转换方向 | 方法 | 说明 |
|---|---|---|
| 数组 → List | Arrays.asList(array) |
最常用,返回一个由数组支持的固定大小的 List,不能修改其大小(如 add, remove 会抛出 UnsupportedOperationException),但可以修改元素。 |
new ArrayList<>(Arrays.asList(array)) |
创建一个全新的、可修改的 ArrayList,包含数组中的所有元素。 |
|
| List → 数组 | list.toArray() |
返回一个Object类型的数组,List 中元素类型不是 Object,则需要强制转换,可能产生 ClassCastException。不推荐直接使用。 |
list.toArray(T[] array) |
最常用且推荐,可以返回一个与 List 元素类型相同的数组,并且效率更高。 |
数组 转 List
Arrays.asList(array) - 最常用
这是将数组转换为 List 最直接、最简单的方法。

特点:
- 它返回的
List是一个视图,或者说是由原始数组支持的,这意味着对这个List的修改(除了修改元素本身)会直接反映到原始数组上,反之亦然。 - 这个
List的大小是固定的,你不能向其中添加或删除元素,否则会抛出UnsupportedOperationException。
代码示例:
import java.util.Arrays;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 1. 创建一个字符串数组
String[] stringArray = {"Apple", "Banana", "Cherry"};
// 2. 使用 Arrays.asList() 将数组转换为 List
// 注意:这里使用了钻石操作符 <>,让编译器自动推断泛型类型
List<String> fruitList = Arrays.asList(stringArray);
System.out.println("转换后的 List: " + fruitList);
System.out.println("原始数组: " + Arrays.toString(stringArray));
// 3. 修改 List 中的元素
fruitList.set(1, "Blueberry"); // 修改是允许的
System.out.println("修改 List 后的 List: " + fruitList);
System.out.println("修改 List 后的数组: " + Arrays.toString(stringArray)); // 数组也被修改了!
// 4. 尝试添加元素(会抛出异常)
try {
fruitList.add("Date");
} catch (UnsupportedOperationException e) {
System.out.println("\n错误:不能向固定大小的 List 添加元素。");
e.printStackTrace();
}
}
}
输出:
转换后的 List: [Apple, Banana, Cherry]
原始数组: [Apple, Banana, Cherry]
修改 List 后的 List: [Apple, Blueberry, Cherry]
修改 List 后的数组: [Apple, Blueberry, Cherry]
错误:不能向固定大小的 List 添加元素。
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
...
创建一个新的 ArrayList - 可修改的 List
如果你需要一个可以自由修改大小(添加、删除元素)的 List,你需要基于 Arrays.asList() 的结果创建一个新的 ArrayList。

特点:
- 创建一个全新的
ArrayList对象,与原始数组脱离关系。 - 对新
List的任何修改都不会影响原始数组。
代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToModifiableList {
public static void main(String[] args) {
String[] stringArray = {"Apple", "Banana", "Cherry"};
// 使用 Arrays.asList() 创建一个 List,然后用它来初始化一个新的 ArrayList
List<String> modifiableList = new ArrayList<>(Arrays.asList(stringArray));
System.out.println("初始可修改 List: " + modifiableList);
// 现在可以安全地添加和删除元素了
modifiableList.add("Date");
modifiableList.remove(0); // 移除 "Apple"
System.out.println("修改后的可修改 List: " + modifiableList);
System.out.println("原始数组(未受影响): " + Arrays.toString(stringArray));
}
}
输出:
初始可修改 List: [Apple, Banana, Cherry]
修改后的可修改 List: [Banana, Cherry, Date]
原始数组(未受影响): [Apple, Banana, Cherry]
List 转数组
list.toArray() - 不推荐
这个方法将 List 转换为一个 Object[] 类型的数组。

缺点:
- 返回的数组是
Object[]类型,如果你的List存放的是特定类型(如String),你需要强制转换,这可能会在运行时抛出ClassCastException。 - 不够类型安全,代码可读性差。
代码示例(演示其缺点):
import java.util.ArrayList;
import java.util.List;
public class ListToArrayBadExample {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");
// 不推荐的方式:返回 Object[]
Object[] objectArray = stringList.toArray();
// 如果我们想要一个 String[] 数组,必须强制转换
String[] stringArray = (String[]) stringList.toArray(); // 这行代码会编译,但运行时可能出错
System.out.println("转换后的数组: " + Arrays.toString(stringArray));
}
}
注意:在这个特定例子中,因为 List 中确实都是 String,所以强制转换不会失败,但如果 List 是 List<Object> 并且混入了其他类型的对象,强制转换就会失败。
list.toArray(T[] array) - 推荐使用
这是最安全、最高效的方法,它利用了 Java 的泛型。
特点:
- 类型安全:返回的数组类型与传入的数组类型相同,无需强制转换。
- 高效:如果你传入的数组长度大于或等于
List的大小,List会直接填充这个数组并返回它,避免了创建新数组的开销。 - 自动扩容:如果你传入的数组长度小于
List的大小,或者传入一个空数组(如new String[0]),toArray方法会自动创建一个新数组,其大小正好能容纳List的所有元素,并将元素复制进去。
最佳实践:传入一个空数组
这是最简洁、最常用的方式,让 toArray 方法为你处理所有事情。
代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListToArrayGoodExample {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");
// 推荐方式:传入一个空数组,让 toArray 方法创建正确类型和大小的数组
String[] stringArray = stringList.toArray(new String[0]);
System.out.println("转换后的数组: " + Arrays.toString(stringArray));
// 另一种方式:创建一个足够大的数组
// String[] anotherArray = new String[stringList.size()];
// stringList.toArray(anotherArray);
// System.out.println("另一种方式转换的数组: " + Arrays.toString(anotherArray));
}
}
输出:
转换后的数组: [Hello, World]
总结与最佳实践
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 数组 → 只读/视图 List | Arrays.asList(array) |
高效,直接映射,无需额外内存。 |
| 数组 → 可修改 List | new ArrayList<>(Arrays.asList(array)) |
创建一个独立的、可操作的副本。 |
| List → 数组 | list.toArray(new T[0]) |
最推荐,类型安全、代码简洁、性能良好,让方法处理数组创建。 |
记住这些核心区别和推荐用法,你就能在 Java 中轻松自如地处理 List 和数组的转换了。
