Arrays.asList

news2025/1/13 15:40:41

文章目录

    • 摘要
    • 详解
    • 我们再去看看 java.util.ArrayList 为什么可变的呢?
    • Arrays.asList()和 Collections.singletonList()
    • 额外:Collections.singletonList()

摘要

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

  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 长度不可变
image.png

// 使用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 长度也不可变,但是可以修改数组中的元素
image.png

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

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

然后,他在增加元素的时候,当目前长度已无法继续插入新元素,就会进行长度的扩容
image.png

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

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

题目3 文件包含(保姆级教程)

url&#xff1a;http://192.168.154.253:83 #打开http://XXX:81/&#xff0c;XXX为靶机的ip地址 审题 1、打开题目看到有一个提示&#xff0c;此题目需要通过利用存在的文件包含漏洞&#xff0c;尝试获取webshell&#xff0c;最后从根目录下key.php文件中获得flag 2、开始答题…

老年公寓人员定位管理系统:提升安全与关怀的智能解决方案

老年公寓作为提供安全居住环境和关怀服务的重要场所&#xff0c;面临着人员管理和安全控制的挑战。为了解决这些问题&#xff0c;老年公寓人员定位管理系统应运而生。基于为提供全面的安全管理和个性化关怀服务&#xff0c;华安联大便通过老年公寓人员定位管理系统的技术原理、…

在react中配置less

第一步&#xff1a;暴露出webpack配置文件 终端命令&#xff1a;npm run eject (此命令一旦运行不可逆) 第二步&#xff1a;安装less以及less-loader npm install less less-loader --save-dev 第三步&#xff1a;修改webpack的配置文件 运行完以上命令后&#xff0c;项目…

文心千帆大模型测评分享,效果超出预期

一、前言 现如今&#xff0c;随着ChatGPT的爆火越来越多的人开始关注人工智能领域了&#xff0c;大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题。但ChatGPT是有一定的使用门槛的&#xff1a;首先需要我们“科学上网”才能访问&#xff0c;其次GPT4的价格相…

02-线性结构3 Reversing Linked List

第一次提交 第二次 今日积累&#xff1a;while(n--){} n结束的值是-1而不是0 (꒪⌓꒪) code # include <iostream>struct Node {int data;int p_nxt; } L[100000];int main(void) {int p_start; // first node addressint K; int N; //不保真&#xff0c;待会要顺着链表…

刘铁猛C#教程笔记——方法

方法的由来 C#语言和Java语言都是由C语言发展而来&#xff0c;而C语言是由C语言发展而来&#xff0c;C语言全面兼容C语言&#xff0c;在C语言的基础上引入了类的概念&#xff0c;即面相对象程序设计思想的核心内容&#xff0c;C语言不是完全的面相对象程序设计语言&#xff0c…

十一、正则表达式详解:掌握强大的文本处理工具(三)

文章目录 &#x1f340;贪婪模式&#x1f340;应用的场景&#x1f340;总结 &#x1f340;非贪婪模式&#x1f340;应用的场景&#x1f340;总结 &#x1f340;贪婪模式与非贪婪模式在爬虫的应用&#x1f340;转义字符&#x1f340;正则表达式常见函数 &#x1f340;贪婪模式 在…

应用层协议:httphttps,如何进行安全握手?

目录 应用层协议序列化与反序列化JSON网络版本计算器URLurlencode和urldecode HTTP协议简单认识HTTP协议HTTP协议格式HTTP的一些方法HTTP状态码Http的特征cookieConnection HTTPSHTTPS是什么加密与解密常见的加密方式对称加密非对称加密 什么是数据摘要什么是证书HTTPS如何安全…

【MySQL】MySQL数据库的进阶使用

别灰心&#xff0c;一切都会好起来的… 文章目录 一、MySQL基本查询1.对表内容进行Create(增加)1.1 insert语句的使用1.2 插入查询结果&#xff08;删除表中的重复记录&#xff09; 2.对表内容进行Retrieve(读取)3.对表内容进行Update(更新)4.对表内容进行Delete(删除)4.1 del…

056、查询优化之优化实战

快速定位问题SQL Dashboard->SQL Statements 快速定位慢查询 Dashboard -> slow queries DML语句优化 大量DML操作导致OOM 案例背景 索引扫描范围过大&#xff0c;无论优化器是选择index scan还是table scan&#xff0c;TiDB都倾向 TiKV corprocessor请求读取大…

Kotlin~Proxy代理模式

概念 又称委托模式&#xff0c;充当中介代理的类。 特点&#xff1a;让一个对象控制另一个对象的访问&#xff0c;让代理充当其他事物的接口。 角色介绍 抽象目标类具体目标类代理类 UML 代码实现 按实现分为静态和动态代理 interface PhoneSell {fun sell() }class Main…

MQ消费者报错

我在运行MQ消费者时 报了如下错误 Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (default-cli) on project consumer: Command execution failed. 解决办法 第一步&#xff1a; 在pom.xml文件上增加这个插件 <build><plugins><pl…

RPA界面元素定位与操控技术详解

什么是 RPA&#xff1f;RPA 是机器人流程自动化 Robotic Process Automation 的简写。在《智能RPA实战》中&#xff0c;我们这样定义&#xff1a;通过特定的、可模拟人类在计算机界面上进行操作的技术&#xff0c;按照规则自动执行相应的流程任务&#xff0c;代替或辅助人类完成…

OpenHarmony轻量设备获取网络中设备IP方式-组播

一、简介 ​ 在Openharmony的轻量和小型系统中&#xff0c;受限于cpu与内存资源等原因&#xff0c;网络协议一般使用lwip的实现。而且受限资源影响&#xff0c;lwip的socket数与端口数都通过宏定义控制在7-8个以内。在物联IOT实际应用中&#xff0c;经常会出现多台IOT设备在未…

MySQL 的缓存介绍

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 一般情况下&#xff0c;我们不会用到数据库自带的缓存&#xff0c;所以 MySQL 默认是不开启缓存的。只有以读为主的业务&#xff0c;数据不变化的情况下&#xff0c;可以开启数据库的缓存。 查看缓存是否开启&…

NAT技术是什么?谈谈它的实现方式、优缺点以及作用

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 随着网络的不断发展&#xff0c;网络的应用也越来越多&#xff0c;有限的IPV4地址就显得不怎么够用&#xff0c;所以出现了NAT技术&…

Linux系统下的文件权限

目录 一&#xff1a;关于人的权限 二&#xff1a;关于文件本身的权限 三&#xff1a;修改文件属性 chmod 身份/-rwx chmod 八进制数 四、更改文件所有人 ​编辑五、umask权限掩码 umask权限掩码的计算 Linux系统不以文件后缀来区分文件类型&#xff0c;当我们使用ls -l命…

springCloud整合Nacos当配置中心和注册中心

前言 本文主要介绍SpringCloud使用Nacos当配置中心和注册中心&#xff0c;通过一个简单的Demo学习Naocs的基本配置以及不同微服务之间通过RestTemplate 及openfeign完成接口调用。 Nacos的安装配置 Nacos的学习资源主要有以下两个 Nacos管网 Nacos管网Nacos GitHub NacosGi…

智力差异性对课程的影响

“收藏从未停止&#xff0c;练习从未开始”&#xff0c;或许有那么一些好题好方法&#xff0c;在被你选中收藏后却遗忘在收藏夹里积起了灰&#xff1f;今天请务必打开你沉甸甸的收藏重新回顾&#xff0c;分享一下那些曾让你拍案叫绝的好东西吧&#xff01; 你可以从以下几个方…

debian/PVE安装好后拔显卡后连接不了网络

目录 前因 原因 解决办法 注意 需要主板bios支持跳过显卡自检 解决好主板bios问题然后再继续解决系统问题 前因 前几天装了个​Proxmox​ ve当做一个服务器7*24开机 但是由于转好系统后&#xff0c;显卡就不需要了 加上它耗电的原因&#xff08;我的gtx650平时空载有1…