TL;DR)
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
Arrays.asList() |
最简单、最直接,性能好(底层是数组视图) | 返回的是固定大小的列表,不能添加或删除元素 | 当你只需要一个只读的列表视图时 |
| Java 8+ Stream API | 灵活,可以轻松进行后续操作(如过滤、映射),返回的是可修改的 ArrayList |
代码稍显冗长,对于简单转换性能不如 Arrays.asList() |
需要对数据进行流式处理或需要可修改的列表时 |
| 手动循环添加 | 最灵活,适用于任何 Java 版本 | 代码最繁琐,性能最差 | 在非常古老的 Java 版本(< 1.5)或需要特殊逻辑时 |
使用 Arrays.asList() (最常用)
这是最直接、最高效的方法,它的核心特点是返回的 ArrayList 并不是我们通常使用的 java.util.ArrayList,而是 Arrays 内部的一个静态私有类 ArrayList。

(图片来源网络,侵删)
代码示例
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class ArrayToListExample {
public static void main(String[] args) {
// 1. 定义一个 String 数组
String[] stringArray = {"Apple", "Banana", "Cherry"};
// 2. 使用 Arrays.asList() 将数组转换为 List
// 注意:这里的 list 是 java.util.Arrays.ArrayList,不是 java.util.ArrayList
List<String> listFromArrays = Arrays.asList(stringArray);
// 3. 打印结果
System.out.println("转换后的 List: " + listFromArrays);
System.out.println("List 的类型: " + listFromArrays.getClass().getName());
}
}
输出:
转换后的 List: [Apple, Banana, Cherry]
List 的类型: java.util.Arrays$ArrayList
⚠️ 重要注意事项 (固定大小)
这个转换后的 List 是固定大小的,它的“视图”直接指向原始数组,这意味着:
- 不能添加元素:如果尝试调用
add()方法,会抛出UnsupportedOperationException。 - 不能删除元素:如果尝试调用
remove()方法,同样会抛出UnsupportedOperationException。
// 接续上面的代码
try {
listFromArrays.add("Date"); // 尝试添加一个元素
System.out.println("添加成功?"); // 这行代码不会执行
} catch (UnsupportedOperationException e) {
System.out.println("错误:不能添加元素!"); // 这行代码会执行
e.printStackTrace();
}
输出:
转换后的 List: [Apple, Banana, Cherry]
List 的类型: java.util.Arrays$ArrayList
错误:不能添加元素!
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
...
如何获得一个可修改的 ArrayList?
如果你需要一个真正的、可以自由增删改的 java.util.ArrayList,最简单的方法是使用它的构造函数,将 Arrays.asList() 的结果作为参数传入。

(图片来源网络,侵删)
// 使用 Arrays.asList() 得到的 List 作为构造函数参数
List<String> modifiableList = new ArrayList<>(Arrays.asList(stringArray));
// 现在可以自由地添加和删除元素了
modifiableList.add("Date");
modifiableList.remove("Apple");
System.out.println("可修改的 List: " + modifiableList);
// 输出: 可修改的 List: [Banana, Cherry, Date]
使用 Java 8+ Stream API (最灵活)
从 Java 8 开始,Stream API 提供了一种非常优雅和强大的方式来处理集合,将数组转换为 ArrayList 也可以通过 Stream 实现。
代码示例
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.ArrayList;
public class StreamExample {
public static void main(String[] args) {
// 1. 定义一个 Integer 数组
Integer[] intArray = {1, 2, 3, 4, 5};
// 2. 使用 Stream API 转换
// .stream() 将数组转为 Stream
// .collect(Collectors.toCollection(ArrayList::new)) 将 Stream 收集到一个新的 ArrayList 中
ArrayList<Integer> arrayListFromStream = Arrays.stream(intArray)
.collect(Collectors.toCollection(ArrayList::new));
// 3. 打印结果
System.out.println("转换后的 ArrayList: " + arrayListFromStream);
System.out.println("ArrayList 的类型: " + arrayListFromStream.getClass().getName());
}
}
输出:
转换后的 ArrayList: [1, 2, 3, 4, 5]
ArrayList 的类型: java.util.ArrayList
优点
- 灵活性高:可以在转换过程中进行链式操作,例如过滤、映射等。
- 返回标准
ArrayList:直接得到一个可以自由修改的java.util.ArrayList,无需额外步骤。
// 带有过滤和映射的示例
String[] names = {"Alice", "Bob", "Charlie", "David"};
ArrayList<String> longNames = Arrays.stream(names)
.filter(name -> name.length() > 4) // 只保留长度大于4的名字
.collect(Collectors.toCollection(ArrayList::new));
System.out.println("过滤后的长名字列表: " + longNames);
// 输出: 过滤后的长名字列表: [Alice, Charlie, David]
手动循环添加 (最传统)
这种方法适用于所有 Java 版本,但在现代 Java 中已经很少使用,因为它代码冗长且效率较低。
代码示例
import java.util.ArrayList;
import java.util.List;
public class ManualLoopExample {
public static void main(String[] args) {
// 1. 定义一个数组
String[] fruits = {"Apple", "Banana", "Cherry"};
// 2. 创建一个新的 ArrayList
List<String> fruitList = new ArrayList<>();
// 3. 使用 for-each 循环遍历数组,并将每个元素添加到 ArrayList 中
for (String fruit : fruits) {
fruitList.add(fruit);
}
// 4. 打印结果
System.out.println("手动转换的 List: " + fruitList);
}
}
输出:

(图片来源网络,侵删)
手动转换的 List: [Apple, Banana, Cherry]
结论与最佳实践
| 场景 | 推荐方法 |
|---|---|
| 只需要一个临时的、只读的列表,用于遍历或传递给一个只读方法。 | Arrays.asList() (最简单高效) |
需要一个可以自由增删改的 ArrayList,且没有其他复杂操作。 |
new ArrayList<>(Arrays.asList(yourArray)) (最清晰) |
| 需要在转换过程中进行过滤、映射等操作,或者代码风格偏向函数式。 | Java 8+ Stream API (最灵活强大) |
| 在 Java 8 之前的旧项目中。 | 手动循环添加 (兼容性最好) |
对于绝大多数现代 Java 开发场景,new ArrayList<>(Arrays.asList(yourArray)) 是获得一个标准可修改 ArrayList 的首选,因为它既保留了 Arrays.asList() 的简洁性,又解决了其不可修改的问题,如果需要额外处理,则直接使用 Stream API。
