java 数组转List

在Java中,将数组转换为List有多种方法,但不同方法在可变性、对基本类型的支持、依赖库等方面存在差异。以下是详细总结及示例:


1. 使用 Arrays.asList()(不可变列表)

  • 特点:生成的List是固定大小(基于原始数组的视图),不可添加/删除元素,但可修改元素值。
  • 示例
    String[] arr = {"A", "B", "C"};
    List<String> list = Arrays.asList(arr); 
    list.set(0, "X");        // 允许修改元素
    // list.add("D");        // 抛出 UnsupportedOperationException
    
  • 陷阱
    • 若数组是基本类型(如int[]),Arrays.asList()会将整个数组视为单个元素:
      int[] nums = {1, 2, 3};
      List<int[]> wrongList = Arrays.asList(nums); // List<int[]>,而非List<Integer>
      

2. 包装为 new ArrayList<>()(可变列表)

  • 特点:通过构造新ArrayList,允许增删元素。
  • 示例
    String[] arr = {"A", "B", "C"};
    List<String> list = new ArrayList<>(Arrays.asList(arr));
    list.add("D"); // 允许操作
    

3. Java 8+ 的 Stream(支持基本类型)

  • 特点:通过流处理,支持基本类型数组转换,生成可变列表。
  • 示例
    int[] nums = {1, 2, 3};
    List<Integer> list = Arrays.stream(nums)
                               .boxed() // 装箱为Integer
                               .collect(Collectors.toList());
    
    或显式指定集合类型:
    List<Integer> list = Arrays.stream(nums)
                               .boxed()
                               .collect(Collectors.toCollection(ArrayList::new));
    

4. 手动遍历添加(灵活但繁琐)

  • 特点:逐个添加元素到新列表,适合复杂逻辑。
  • 示例
    String[] arr = {"A", "B", "C"};
    List<String> list = new ArrayList<>();
    for (String s : arr) {
        list.add(s);
    }
    // 或使用 Collections.addAll()
    Collections.addAll(list, arr);
    

5. 第三方库(需引入依赖)

(1) Guava 的 Lists.newArrayList()

import com.google.common.collect.Lists;
List<String> list = Lists.newArrayList(arr);

(2) Apache Commons 的 ListUtils.toList()

import org.apache.commons.collections4.ListUtils;
List<String> list = ListUtils.toList(arr);

6. 处理基本类型数组

  • 问题:直接转换基本类型数组会得到包含数组的List,需特殊处理。
  • 解决方案
    int[] nums = {1, 2, 3};
    // 方法1:遍历装箱
    List<Integer> list = new ArrayList<>();
    for (int num : nums) {
        list.add(num);
    }
    // 方法2:使用Stream
    List<Integer> list = IntStream.of(nums)
                                 .boxed()
                                 .collect(Collectors.toList());
    

总结

方法 可变性 支持基本类型 依赖库 适用场景
Arrays.asList() 不可变 快速只读访问
new ArrayList<>() 可变 需增删操作
Java 8 Stream 可变 处理基本类型或链式操作
手动遍历 可变 需要自定义逻辑
Guava/Apache Commons 可变 需引入 项目中已使用第三方库

最佳实践

  • 若需可变列表且非基本类型:优先使用 new ArrayList<>(Arrays.asList(array))
  • 处理基本类型数组:使用 Stream 或手动遍历。
  • 避免直接操作 Arrays.asList() 生成的列表(除非明确只读需求)。
posted @ 2025-03-24 10:57  bravecap  阅读(896)  评论(0)    收藏  举报