• Arrays.asList() 和 List.of() 的列表之争


    在这里插入图片描述

    1. 概述

    有时在Java中,为了方便,我们需要创建一个小列表或将数组转换为列表。Java 为此提供了一些辅助方法。

    在本文中,我们将比较初始化小型临时数组的两种主要方法:List.of()和 Array.asList()。

    2. Arrays.asList()

    Java 自1.2版本引入的Arrays.asList(),从而简化了List对象的创建,该对象是Java Collections Framework的一部分。它可以将数组作为输入的同时并创建所提供数组的List对象。
    方法源码:

    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
    
    • 1
    • 2
    • 3

    说白了就是拿参数直接new了一个对象,和自己创建一个数组是一样一样的。

    示例:

    Integer[] array = new Integer[]{1, 2, 3, 4,5};
    List<Integer> list = Arrays.asList(array);
     MatcherAssert.assertThat("匹配项不相等",list, Matchers.containsInAnyOrder(1,2,3,4,5));
    
    • 1
    • 2
    • 3

    创建一个简单的整数列表非常容易。

    2.1. 返回列表上不支持的操作

    asList()方法返回一个固定大小的列表。因此,添加和删除新元素都会抛出UnsupportedOperationException。

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Assert.assertThrows("新增Item",UnsupportedOperationException.class, () -> list.add(6));
    
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Assert.assertThrows("删除Item",UnsupportedOperationException.class, () -> list.remove(1));
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2. 使用数组

    我们需要注意的是,列表不会创建输入数组的副本。相反,它使用List接口包装原始数组。因此,对数组的更改也会反映在列表上:

    Integer[] array = new Integer[]{1,2,3};
    List<Integer> list = Arrays.asList(array);
    array[0] = 1000;
    MatcherAssert.assertThat("list.get(0)的结果不等于1000",list.get(0),Matchers.equalTo(1000));
    
    • 1
    • 2
    • 3
    • 4

    2.3. 更改返回列表

    另外,Arrays.asList()返回的列表是可变的。也就是说,我们可以更改列表的各个元素:

    List<Integer> list = Arrays.asList(1, 2, 3, 4);
    list.set(1, 1000);
    MatcherAssert.assertThat("list.get(0)的结果不等于1000",list.get(0),Matchers.equalTo(1000));
    
    • 1
    • 2
    • 3

    最终,这可能会导致不良的副作用,从而导致难以发现的错误。当提供数组作为输入时,列表上的更改也将反映在数组上:

    Integer[] array = new Integer[]{1, 2, 3};
    List<Integer> list = Arrays.asList(array);
    list.set(0,1000);
    assertThat(array[0]).isEqualTo(1000);
    
    • 1
    • 2
    • 3
    • 4

    小结:使用Arrays.asList()创建的列表,可以对内容值进行更改,但是不能对列表的长度进行更改。

    我们看看另一种创建列表的方法。

    3. List.of()

    与数组asList()方法相反,在Java 9 中引入了一个更方便的新的方法:List.of()。它将创建不可修改的List对象的实例:

    
     Integer[] array = new Integer[]{1, 2, 3, 4,5};
     List<Integer> list = List.of(array);
     MatcherAssert.assertThat("匹配项不相等",list, Matchers.containsInAnyOrder(1,2,3,4,5));
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.1. 与Arrays.asList()的区别

    与Arrays.asList()的主要区别在于List.of ()返回一个不可变列表,该列表是所提供的输入数组的副本 。因此,对原始数组的更改不会反映在返回的列表中:

    Integer[] array = new Integer[]{1, 2, 3, 4, 5};
    List<Integer> list = List.of(array);
    array[0] = 1000;
    MatcherAssert.assertThat("list.get(0)的值不为1",list.get(0),Matchers.equalTo(1));
    
    • 1
    • 2
    • 3
    • 4

    此外,我们无法修改列表的元素。如果我们尝试这样做,它将抛出UnsupportedOperationException:

    List<String> list = List.of(1, 2, 3, 4, 5);
    assertThrows(UnsupportedOperationException.class, () -> list.set(1, 6));
    
    • 1
    • 2

    3.2. 空值

    我们还应该注意List.of()不允许空值作为输入,并且会抛出NullPointerException:

    assertThrows(NullPointerException.class, () -> List.of(1, null, 2));
    
    • 1

    4。结论

    Arrays.asList()返回由指定数组支持的固定大小列表。对数组所做的更改将在返回的列表中可见,对列表所做的修改将在数组中可见。返回的列表是Serializable的,并实现了RandomAccess。
    List.of()返回包含任意数量元素的不可修改列表。另外,此方法还接受单个数组作为参数。结果列表的元素类型将是数组的组件类型,列表的大小将等于数组的长度。要使用作为数组的单个元素创建列表,请执行以下操作:

    String[] array = ... ;  
    List<String[]> list = List.<String[]>of(array);
    
    • 1
    • 2

    这将导致List.of(E)方法被调用。

  • 相关阅读:
    数据挖掘与分析应用1:Excel表数据分析,sum,sumif,sumifs,vlookup,match,index,几个配合使用
    看起来是线程池的BUG,但是我认为是源码设计不合理。
    Java核心知识体系3:异常机制详解
    Redis中的Lua脚本(一)
    Python每日一练——第9天:选择排序【含动图展示】
    IDEA 高分辨率卡顿优化
    毕业设计-基于机器视觉的火灾烟雾检测识别系统-yolo
    嵌入式硬件中常见的面试问题与实现
    python使用rabbitmq发送消息和接收消息数据
    【附源码】Python计算机毕业设计数据结构知识点渐进学习网站
  • 原文地址:https://blog.csdn.net/m290345792/article/details/134238536