Arrays.asList

这篇具有很好参考价值的文章主要介绍了Arrays.asList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

先总结要点,接下来详细讲解

  1. 返回由指定数组支持的长度不可变的列表,可以看做是传入数组的 list 视图,对 list 的修改其实是在修改该数组,所以 list 中元素可以修改,但是不可以增加或删除元素
  2. 返回的列表是可序列化的,并实现 RandomAccess 可以随机访问。
  3. 此方法与 collection.toArray 结合,充当基于数组和基于集合的 API 之间的桥梁。
// 使用Arrays.asList创建列表
List<String> list1 = Arrays.asList("apple", "banana", "orange");
// 或者
// List<String> list1 = Arrays.asList(new String[] {"apple", "banana", "orange"});
System.out.println(list1); // 输出: [apple, banana, orange]
// 尝试修改列表
list1.set(0, "pear");
System.out.println(list1); // 输出: [pear, banana, orange]
// 尝试修改列表大小
list1.remove(0); // 抛出UnsupportedOperationException异常
System.out.println(list1); // 输出: [pear, banana, orange]
list1.add("grape"); // 抛出UnsupportedOperationException异常

详解

返回由指定数组支持的长度不可变的列表,可以看做是传入数组的 list 视图。(因为对返回列表的更改其实是对传入的参数数组进行的修改,所以长度不可变,但是数组中存的元素是可以变得)
图中我们可以看到 Arrays.asList()的底层其实调用了 new ArrayList<>(a),但是此 ArrayList 不是我们经常使用的那个(java.util.ArrayList),而是 Arrays 类中自己实现了一个 ArrayList 类(java.util.Arrays$ArrayList),不然也不会长度不能变了,毕竟我们当时学习的时候说使用 list 而不使用 array 的一个很重要原因就是 list 长度可变而 array 长度不可变
Arrays.asList,java,java,数组,Arrays.asList,list,列表

// 使用Arrays.asList创建列表
List<String> list1 = Arrays.asList("apple", "banana", "orange");
// 使用new ArrayLis创建列表
List<String> list2 = new ArrayList();
// 输出list1的类java.util.Arrays$ArrayList
System.out.println(list1.getClass());
// 输出list2的类java.util.ArrayList
System.out.println(list2.getClass());

我们接着往下看,看看 Arrays 类自己实现的 ArrayList 类是怎么样的,我们发现他维护了一个数组,而这个数组是 final 定义的,表明一旦被初始化以后,就不能再赋新的值,而我们可以看到他初始化使用的正是我们传入的那个数组,所以因为数组长度不可变,所以 list 长度也不可变,但是可以修改数组中的元素
Arrays.asList,java,java,数组,Arrays.asList,list,列表

我们再去看看 java.util.ArrayList 为什么可变的呢?

首先他底层维护的也是数组,并且没有使用 final 修饰,说明他是可以重复被赋值的(暗示)
Arrays.asList,java,java,数组,Arrays.asList,list,列表

然后,他在增加元素的时候,当目前长度已无法继续插入新元素,就会进行长度的扩容
Arrays.asList,java,java,数组,Arrays.asList,list,列表

然后我们发现 grow 方法中会将旧数组中的元素全部 copy 到新数组(是原数组长度的 1.5 倍)中,并且把 arraylist 中保存元素的数组重新复制为新数组(Arrays.copyOf()会把旧数组的元素拷贝到新数组,并且返回新数组)
Arrays.asList,java,java,数组,Arrays.asList,list,列表

Arrays.asList()和 Collections.singletonList()

Collections.singletonList()Arrays.asList() 都是 Java 集合框架中常用的实用方法,用于创建列表。但它们之间存在一些重要的区别:

  1. 元素数量
    • Collections.singletonList(T item):仅用于创建一个只有一个元素的列表。
    • Arrays.asList(T... items):可以用于创建包含任意数量元素的列表。
  2. 不可变性
    • Collections.singletonList(T item):返回的列表是完全不可变的,这意味着你不能添加、删除或修改列表中的元素。
    • Arrays.asList(T... items):返回的列表的大小是固定的,这意味着你不能添加或删除元素。但是,你可以更改列表中的元素,因为其内部数组是可变的。
  3. 内部实现
    • Collections.singletonList(T item):返回的是一个维护了单一元素的实例。
    • Arrays.asList(T... items):返回的是一个维护一个数组的实例
  4. 使用场景
    • Collections.singletonList(T item):当你确定需要一个只有一个元素的不可变列表时使用。
    • Arrays.asList(T... items):当你需要一个包含多个元素的固定大小的列表时使用,且可能需要更改元素。
  5. 效率
    • Collections.singletonList(T item):由于它是为单一元素优化的,所以通常会比 Arrays.asList() 更加高效(当只有一个元素时)。比如当只有一个元素时Collections.singletonList只维护一个变量,而 Arrays.asList()需要维护一个数组去存放这个单一元素
  6. 例子:
java List<String> singleItemList = Collections.singletonList("one");// 只包含一个元素 "one" 的不可变列表
List<String> multipleItemList = Arrays.asList("one", "two", "three"); // 包含三个元素的列表

总结:因此,推荐使用 Arrays.asList 还是 Collections.singletonList 取决于你的具体需求。如果需要一个可变的列表或需要对列表进行批量操作,那么使用 Arrays.asList 更为合适。如果需要一个不可变的只包含一个元素的列表,那么使用 Collections.singletonList 更为合适。

额外:Collections.singletonList()

Collections.singletonList()是 Java 集合框架中的一个静态方法,用于创建一个不可变的只包含一个元素的列表。

该方法的签名如下:

public static <T> List<T> singletonList(T o)

它接受一个参数 o,表示要包含在列表中的元素,然后返回一个不可变的 List 对象,该列表只包含一个元素 o。

该方法的特点如下:

  1. 返回的列表是不可变的,即列表的大小和元素都是固定的,不支持添加、删除和修改操作。
  2. 返回的列表是线程安全的,可以在多线程环境下使用,无需额外的同步措施。
  3. 返回的列表不允许包含 null 元素,如果传入的参数 o 为 null,则会抛出 NullPointerException 异常。

使用示例:

String element = "Hello";
List<String> list = Collections.singletonList(element);
System.out.println(list); // 输出: [Hello]

需要注意的是,由于返回的列表是不可变的,如果需要对列表进行修改操作,那么就不适合使用 Collections.singletonList(),而应该使用其他可变的列表实现,如 ArrayList。

Arrays.asList,java,java,数组,Arrays.asList,list,列表文章来源地址https://www.toymoban.com/news/detail-602741.html

到了这里,关于Arrays.asList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Arrays.asList()方法 讲解

    ✨作者:猫十二懿 ❤️‍🔥账号:CSDN 掘金 个人博客 Github 🎉公众号:猫十二懿 Arrays.asList()是一个Java数组与集合之间的桥梁方法,它可以将一个数组转换为一个List集合。使用Arrays.asList()方法,我们可以将一个数组转换为一个List集合,然后使用List的方法来操作这个集合,比

    2024年02月15日
    浏览(57)
  • Arrays.asList

    先总结要点,接下来详细讲解 返回由指定数组支持的长度不可变的列表,可以看做是传入数组的 list 视图,对 list 的修改其实是在修改该数组,所以 list 中元素可以修改,但是不可以增加或删除元素 返回的列表是可序列化的,并实现 RandomAccess 可以随机访问。 此方法与 col

    2024年02月16日
    浏览(42)
  • Arrays.asList():使用指南

    Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合。这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性。本文将介绍 Arrays.asList() 的语法、应用场景、坑点和总结。 语法 应用场景 坑点 总结 Arrays.asList() 的语

    2024年02月08日
    浏览(37)
  • Arrays.asList 和 null 类型

    Arrays.asList() 返回的List 是它的内部类,不能使用 retainAll() 取交集,导致元素的删除,会报错。 null 不能使用 instanceof ,返回的都是false。

    2024年02月09日
    浏览(44)
  • Java 中数组Array和列表List的转换

    主要介绍Java中Java 中数组Array和列表List的转换。 1.使用Collections.addAll()方法 使用Collections.addAll()方法,返回的List可以执行新增add方法,但该种方式只针对引用对象,不针对基本数据类型,该种方法效率较高,推荐用法。 2.使用new ArrayList()构造器方法 new ArrayList()构造器可以传入

    2024年02月10日
    浏览(42)
  • Arrays.asList和ArrayList.subList,集合添加/修改遇到的问题

    总结: 使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。 注意: 修改原集合元素的值,会影响子集合 修改原集合的结构,会引起ConcurrentModificationException异常 修改子集合元素的值,会

    2024年01月22日
    浏览(70)
  • 27 使用Arrays.asList生成的集合无法使用add、addAll方法及解决方法。

            使用 Array.asList方法生成的ArrayList继承的是AbstractList抽象类 ,如下图所示。          AbstractList又继承了AbstractCollection抽象类,实现了List接口的方法,如下图所示。         如下图所示。可以发现, AbstractionCollection实现了List接口的add和addAll方法。         

    2024年02月14日
    浏览(40)
  • java - 数组工具类Arrays

    目录 前言 一、Arrays是什么? 二、常用方法 1.toString():将数组转换为字符串形式。 2. binarySearch():在已排序的数组中查找指定元素的索引。 3.fill():将数组的所有元素都设置为指定值。 4. copyOf():将一个数组的部分或全部元素复制到一个新数组中。  5.sort(数组):对数组进行

    2024年02月07日
    浏览(63)
  • Java数组中Arrays.fill()方法讲解

    fill()方法共有两种参数类型,分别是: (1)Arrays.fill(int[] a,int value)            a :要进行替换元素的数组            value :替换的元素值 (2)Arrays.fill(int[] a,int fromIndex,int toIndex,int value)            a :要进行替换元素的数组            fromIndex :需要替换元素的第

    2024年02月12日
    浏览(48)
  • Java学习笔记(七)——操作数组工具类Arrays

    操作数组的工具类。 Arrays.toString() Arrays.binarySearch() Arrays.copyOf() 如果新数组的长度小于原始数组的长度——部分拷贝 如果新数组的长度等于原始数组的长度——完全拷贝 如果新数组的长度大于原始数组的长度——完全拷贝+补上默认初始化值0 Arrays.copyOfRange() 范围:包头不包

    2024年01月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包