杰瑞科技汇

Java数组如何直接转为ArrayList?

TL;DR)

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

使用 Arrays.asList() (最常用)

这是最直接、最高效的方法,它的核心特点是返回的 ArrayList 并不是我们通常使用的 java.util.ArrayList,而是 Arrays 内部的一个静态私有类 ArrayList

Java数组如何直接转为ArrayList?-图1
(图片来源网络,侵删)

代码示例

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固定大小的,它的“视图”直接指向原始数组,这意味着:

  1. 不能添加元素:如果尝试调用 add() 方法,会抛出 UnsupportedOperationException
  2. 不能删除元素:如果尝试调用 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() 的结果作为参数传入。

Java数组如何直接转为ArrayList?-图2
(图片来源网络,侵删)
// 使用 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);
    }
}

输出:

Java数组如何直接转为ArrayList?-图3
(图片来源网络,侵删)
手动转换的 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

分享:
扫描分享到社交APP
上一篇
下一篇