• Arrays.asList() 和 Collections.singletonList()


    1. 概述

    List 是我们使用Java时常用的集合类型。

    众所周知,我们可以轻松地在一行中初始化列表。例如,当我们想要初始化一个只有一个元素的List时,我们可以使用Arrays.asList()方法或 Collections.singletonList()方法。

    在本教程中,我们将讨论这两种方法之间的差异。然后,为简单起见,我们将使用单元测试断言来验证某些操作的行为是否符合预期。

    2.Arrays.asList()方法

    首先,Arrays.asList()方法返回一个固定大小的列表

    任何结构更改都将引发UnsupportedOperationException,例如,向列表中添加新元素或从列表中删除元素。现在,让我们通过测试来检查它:

    1. List arraysAsList = Arrays.asList("ONE");
    2. assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(
    3. () -> arraysAsList.add("TWO")
    4. );

    如果我们试一试,测试就会通过。在上面的代码中,我们使用Assertj 的异常断言来验证当我们尝试向列表中添加新元素时是否抛出UnsupportedOperationException

    即使我们不能在列表中调用add() 或remove()操作,我们也可以使用set() 方法更改列表中的元素

    1. arraysAsList.set(0, "A brand new string");
    2. assertThat(arraysAsList.get(0)).isEqualTo("A brand new string");

    这一次,我们使用新的String对象设置列表中的元素。如果我们执行测试,它就会通过。

    最后,让我们讨论Arrays.asList() 方法的数组和返回的列表之间的关系。

    正如方法名称所暗示的那样,此方法使数组用作列表。让我们了解“使数组作为列表工作”是什么意思。

    Arrays.asList() 方法返回一个List对象,该对象由给定数组支持。也就是说,该方法不会将元素从数组复制到新的List对象。相反,该方法在给定数组上提供列表视图。因此,我们对数组所做的任何更改都将在返回的列表中可见。同样,对列表所做的更改也将在数组中可见:

    1. String[] theArray = new String[] { "ONE", "TWO" };
    2. List theList = Arrays.asList(theArray);
    3. //changing the list, the array is changed too
    4. theList.set(0, "ONE [changed in list]");
    5. assertThat(theArray[0]).isEqualTo("ONE [changed in list]");
    6. //changing the array, the list is changed too
    7. theArray[1] = "TWO [changed in array]";
    8. assertThat(theList.get(1)).isEqualTo("TWO [changed in array]");

    测试通过。因此,对于数组和返回的列表,如果我们在一侧进行了一些更改,则另一侧也会更改。

    3.Collections.singletonList() 方法

    首先,singletonList() 方法返回的列表只有一个元素。与Arrays.asList() 方法不同,singletonList() 返回一个不可变的列表

    换句话说,不允许在singletonList() 返回的列表上进行结构性和非结构性更改。测试可以快速说明这一点:

    1. List singletonList = Collections.singletonList("ONE");
    2. assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(
    3. () -> singletonList.add("TWO")
    4. );
    5. assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(
    6. () -> singletonList.set(0, "A brand new string")
    7. );

    如果我们运行测试,它就会通过。因此,无论我们是向列表中添加元素还是更改列表中的元素,它都会抛出UnsupportedOperationException。

    值得一提的是,如果我们看一下返回的列表类的源代码,与其他List实现不同,返回列表中的单个元素不存储在数组或任何其他复杂的数据结构中。相反,列表直接保存元素对象

    1. private static class SingletonList extends AbstractList implements RandomAccess, Serializable {
    2. ...
    3. private final E element;
    4. SingletonList(E obj) {element = obj;}
    5. ...
    6. }

    因此,它将占用更少的内存。

    4. 简短总结

    最后,让我们在一个表中总结Arrays.asList() 方法和 Collections.singletonList()方法的特征,以获得更好的概述:

    Arrays.asList()Collections.singletonList()
    结构变化不允许不允许
    非结构性变化允许不允许
    数据结构由阵列提供支持直接握住元素

    5. 结论

    在这篇快速文章中,我们讨论了Arrays.asList() 方法和 Collections.singletonList()方法。

    当我们想初始化一个只有一个元素的固定大小的列表时,我们可以考虑使用Collections.singletonList() 方法。但是,如果需要更改返回列表中的元素,我们可以选择Arrays.asList() 方法。

    与往常一样,这些示例的完整源代码可在GitHub 上找到。

  • 相关阅读:
    第二周 优化算法实战
    github访问不进去,浏览器证书不安全,访问失败,证书失效,证书颁发者为VMware,谷歌浏览器小bug
    4931: 二叉树遍历(先序中序还原树+后续遍历)
    java-net-php-python-jsp学生党团管理信息系统2020演示录像计算机毕业设计程序
    第一章、基于Ruoyi-Vue开发脚手架之对象存储实现
    《Photoshop 2020从入门到精通》读书笔记1
    八、mysql语句的DDL语句
    Unity 动画知识点
    前端css样式小知识点(大杂烩)
    Android AMS ATMS
  • 原文地址:https://blog.csdn.net/allway2/article/details/127602387