当前位置: 首页 > news >正文

ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of

文章目录

  • List
  • ArrayList
  • LinkedList
  • ArrayList与LinkedList的区别
  • 快速构建list集合
    • Collections.singletonList
    • Arrays.asList
    • ImmutableList.of

Java集合类型有三种:set(集)、list(列表)和map(映射),而List集合是很常用的一种集合类型,

List

我们的常用用法:

List<Object> arrays = new ArrayList<>();

首先要清楚List是个接口,是Collection接口的子接口,拥有Collection所有方法外,还有一些对索引操作的方法。List集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为0)、且可重复的集合。
在这里插入图片描述
具体概念就不延申了。

ArrayList

ArrayList是个什么东西?
在这里插入图片描述
ArrayList是list的实现类,看下其构造函数:

transient Object[] elementData; // non-private to simplify nested class accesspublic ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}

可以看到:ArrayList的最底层实现其实就是一个数组,而在Java中数组的长度是固定的,但是我们实际使用ArrayList的时候不难发现,无论你怎么往这个集合中添加元素,他都不会显示越界,这是为什么呢?可以查看下add方法:

public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;}

具体可以看下ensureCapacityInternal方法里面,最终可以跟踪到grow()方法,具体逻辑不展开了,总归就是ArrayList这个数组可以扩容,ArrayList相当于动态数组。

  • 它继承于AbstractList,实现了List, RandomAccess(随机访问), Cloneable(克隆), java.io.Serializable(可序列化)这些接口。
  • 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
  • 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
  • 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

LinkedList

他又是个啥子东西?
在这里插入图片描述
与ArrayList一样都是list接口的实现类,继承自AbstractSequentialList,而AbstractSequentialList继承自AbstractList,所以跟ArrayList会有共性。
LinkedList 内部使用的双向链表来存储元素。

ArrayList与LinkedList的区别

  • ArrayList 和 LinkedList 是 List 接口的两种不同实现,并且两者都不是线程安全的。
  • ArrayList 内部使用的动态数组来存储元素,LinkedList 内部使用的双向链表来存储元素,这也是 ArrayList 和 LinkedList 最本质的区别。由于内部使用的存储方式不同,导致它们的各种方法具有不同的时间复杂度。
  • ArrayList 和 LinkedList 在内存的使用上也有所不同。LinkedList 的每个元素都有更多开销,因为要存储上一个和下一个元素的地址。ArrayList 没有这样的开销。
  • ArrayList 占用的内存在声明的时候就已经确定了(默认大小为 10),不管实际上是否添加了元素,因为复杂对象的数组会通过 null 来填充。LinkedList 在声明的时候不需要指定大小,元素增加或者删除时大小随之改变(双向链表决定的)。LinkedList 允许内存进行动态分配,这就意味着内存分配是由编译器在运行时完成的,我们无需在 LinkedList 声明的时候指定大小。。
  • ArrayList 只能用作列表;LinkedList 可以用作列表或者队列,因为它还实现了 Deque 接口。
  • 查询的时候,ArrayList 比 LinkedList 快。插入删除的时候LinkedList会更快些。因为数组的元素需要连续的内存位置来存储其值。这就是 ArrayList 进行删除或者插入元素的时候成本很高的真正原因,因为我们必须移动某些元素为新的元素留出空间,比如说:现在有一个数组,10、12、15、20、4、5、100,如果需要在 12 的位置上插入一个值为 99 的元素,就必须得把 12 以后的元素往后移动,为 99 这个元素腾出位置。LinkedList 不需要在连续的位置上存储元素,因为节点可以通过引用指定下一个节点或者前一个节点。也就是说,LinkedList 在插入和删除元素的时候代价很低,因为不需要移动其他元素,只需要更新前一个节点和后一个节点的引用地址即可。。

个人觉得,不知道用哪个,除非有队列使用需求,其它一律使用ArrayList即可。

快速构建list集合

最常见的就是new ArrayList了:

List<String> stringList = new ArrayList<>();
stringList.add("apple");
stringList.add("watermelon");
stringList.add("banana");

这种肯定没毛病,但是比较繁琐,接下来列举几种快速构建的方式:

Collections.singletonList

Collections是集合框架的工具类,里面包含一些对集合的排序,搜索以及序列化的操作,内部的方法都是静态的,没有构造方法,不能实例化,要调用内部方法直接用类名调用(Collections.sort),并且Collections类服务于Collection框架。

List<String> abc = Collections.singletonList("abc");

可以看下singletonList方法:
在这里插入图片描述
可以看到:

  • 调用Collections.singletonList(T o)方法其实是创建了一个SingletonList对象,SingletonList继承了抽象类AbstractList。
  • SingletonList整个集合中只能有一个元素,从名字也能看出来,这个比较适合构建单元素的List集合。
  • 可以看到element为final类型,所以这个唯一的元素一旦被初始化完成后就没法修改了。
  • 不可以使用add方法,虽然包含add方法,但是执行的时候会报错:
    在这里插入图片描述

Arrays.asList

Arrays位于java.util包下(Arrays是一个操作数组的工具类),该类里的方法都是静态方法可以通过Arrays.方法名()直接调用,其实跟Collections差不多,都是工具类。

List<String> stringList = Arrays.asList("abc", "def");

可以看下asList方法:
在这里插入图片描述
可以看到:

  • asList(T… a)方法其实是创建了一个 ArrayList 对象,ArrayList 继承了抽象类 AbstractList。
  • 允许有多个元素存入数组中,但是一旦初始化后,数组的长度就不可以再进行任何的更改,但是数组中的元素可以修改。
  • asList方法中不允许传入null。
  • ArrayList 中存储数组是final类型,所以一旦初始化完成后不可更改长度,可以遍历修改元素但是不可以增加及删除,否则会报UnsupportedOperationException错误。

ImmutableList.of

Guava是来自Google的Java库合集,包含了很多新的集合类型(比如multinmap和mulitset),不可变集合,图库和并发、I/O、哈希、缓存、原始类型等类型的工具集。

List<String> immutableList = ImmutableList.of("english", "chinese");
ImmutableList<String> list = ImmutableList.of("english", "chinese");

接下来我们看下ImuutableList.of的源码:
在这里插入图片描述在这里插入图片描述

  • 我们看下checkElementsNotNull方法:
    在这里插入图片描述
    可以看到其实就是判断元素是否为null,如果为null的话字节抛出空指针异常。所以说ImmutableList.of元素不能为null。
  • 继续看下asImmutableList方法:
    在这里插入图片描述
    可以看到根据元素长度执行了三个逻辑:

长度为0:

public static <E> ImmutableList<E> of() {return (ImmutableList<E>) EMPTY;
}

长度为1:
在这里插入图片描述
在这里插入图片描述
构造了一个SingletonImmutableList,继承于ImmutableList,单元素,final修饰不可变。

其它情况:
在这里插入图片描述
构造了一个RegularImmutableList,继承于ImmutableList,final修饰不可变,不可增删改。

相关文章:

ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of

文章目录 ListArrayListLinkedListArrayList与LinkedList的区别快速构建list集合Collections.singletonListArrays.asListImmutableList.of Java集合类型有三种&#xff1a;set(集)、list(列表)和map(映射)&#xff0c;而List集合是很常用的一种集合类型&#xff0c; List 我…...

恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元

4日早盘&#xff0c;两市股指盘中强势上扬&#xff0c;沪指、深成指涨超1%&#xff0c;上证50指数涨近2%&#xff1b;两市半日成交约5500亿元&#xff0c;北向资金大举流入&#xff0c;半日净买入超60亿元。 截至午间收盘&#xff0c;沪指涨1.12%报3168.38点&#xff0c;深成指…...

解决WebSocket通信:前端拿不到最后一条数据的问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

【java】[maven]每次创建一个maven模块时java compiler版本就是1.6与实际版本不一致(解决本质问题)

目录 方案一&#xff1a; 我没有使用 方案二&#xff1a;修改maven配置文件 前言&#xff1a;每次创建一个maven模块时java compiler版本就是1.6与实际版本不一致 使用的使用maven3.9.1 jdk17&#xff0c;但是每次创建一个maven模块都是会影响之前的模块。网上都是修改pom.xm…...

GPT-5继续秘密训练中!ChatGPT开学大礼包

&#x1f989; AI新闻 &#x1f680; GPT-5继续秘密训练中&#xff01;DeepMind联合创始人披露了未来模型的规模增长 摘要&#xff1a;DeepMind联合创始人在采访中透露&#xff0c;OpenAI正在秘密训练GPT-5&#xff0c;未来3年&#xff0c;Inflection模型将比现在的GPT-4大10…...

3.2.0 终极预告!云原生支持新增 Spark on k8S 支持

视频贡献者 | 王维饶 视频制作者 | 聂同学 编辑整理 | Debra Chen Apache DolphinScheduler 3.2.0 版本将发布&#xff0c;为了让大家提前了解到此版本更新的主要内容&#xff0c;我们已经制作了几期视频和内容做了大致介绍&#xff0c;包括《重磅预告&#xff01;Apache Dol…...

Flutter状态管理 — 探索Flutter中的状态

前言 随着响应式编程的理念&Flutter被大众所了解以来&#xff0c;状态管理一直是一个引人深思的话题。如果想要学习好Flutter这样的响应式的编程框架就一定是离不开状态管理的。我遇到过很多没有了解过响应式编程框架的&#xff0c;或者从事后端开发&#xff0c;自己想用F…...

Python中重要的条件语句教程

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一. 了解条件语句 假设一个场景&#xff1a; 同学们这个年龄去过网吧吗&#xff1f; 去网吧进门想要上网必须做的一件事是做什么&#xff1f;&#xff08;考虑重点&#xff09; 为什么要把身份证给工作人员&#xf…...

记录一下自己对linux分区挂载的理解

一直狠模糊&#xff0c;分两个区&#xff0c;一个挂载/, 一个挂载/home 两者是什么关系 实测 先看挂载的内容 然后umount /home后创建一个新文件 再挂载回去 发现旧分区又回来了&#xff0c;说明路径只是个抽象的概念&#xff0c;分区挂载&#xff0c;互相之间数据是不影响…...

【机器学习】人工智能概述(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

电子学会 2023年3月 青少年软件编程Python编程等级考试三级真题解析(选择题+判断题+编程题)

青少年编程Python编程等级考试三级真题解析(选择题+判断题+编程题) 2023年3月 一、选择题(共25题,共50分) 十进制数111转换成二进制数是?( ) A. 111 B. 1111011 C. 101111 D. 1101111 答案选:D 考点分析:考察python 进制转换 十进制转二进制,采用除二倒取余数,直到商…...

C++算法 —— 动态规划(1)斐波那契数列模型

文章目录 1、动规思路简介2、第N个泰波那契数列3、三步问题4、使用最小花费爬楼梯5、解码方法6、动规分析总结 1、动规思路简介 动规的思路有五个步骤&#xff0c;且最好画图来理解细节&#xff0c;不要怕麻烦。当你开始画图&#xff0c;仔细阅读题时&#xff0c;学习中的沉浸…...

Elasticsearch 对比传统数据库:深入挖掘 Elasticsearch 的优势

当你为项目选择数据库或搜索引擎时&#xff0c;了解每个选项的细微差别至关重要。 今天&#xff0c;我们将深入探讨 Elasticsearch 的优势&#xff0c;并探讨它与传统 SQL 和 NoSQL 数据库的比较。 1. Elasticsearch简介 Elasticsearch 以强大的 Apache Lucene 库为基础&#…...

ICG-Tetrazine的合成方法和步骤-星戈瑞

ICG-Tetrazine的合成方法可以通过多步反应完成&#xff0c;以下是一种常见的合成方法和步骤的示例&#xff1a; 吡咯环合成&#xff1a;首先合成吡咯环作为ICG-Tetrazine的核心结构。可以使用合适的反应条件将相应的吡咯前体化合物&#xff08;例如吡咯-2-甲酸&#xff09;与活…...

C ++ 学习之分文件 实现类

前言 当您在 C 中编写较大的程序时&#xff0c;将所有代码都放在一个文件中可能会变得混乱和不可维护。为了更好地组织代码并提高可维护性&#xff0c;您可以使用分文件实现&#xff08;Separate Compilation&#xff09;的概念。 正文 我的 circle.h 文件 #pragma once #i…...

vue+elementui前端rules校验缓存问题

场景&#xff1a; 最近公司要求项目前端不要用element-ui&#xff0c;改为使用公司其他组开发的ui组件。 这个ui组件使用基本就是安装后&#xff0c;直接全局替换elementui的el-前缀为公司开发的xx-前缀。 替换之后&#xff0c;发现替换倒是很丝滑&#xff0c;问题不大。可以运…...

使用Vue3和Vite升级你的Vue2+Webpack项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

WebSocket 协议及其使用案例

文章目录 前言一、初识 WebSocket 协议1.1 什么是 WebSocket 协议1.2 WebSocket 与 HTTP 的关系1.3 WebSocket 握手的过程1.4 WebSocket 解决了什么问题 二、WebSocket 数据帧格式2.1 WebSocket 数据帧格式图示2.2 各字段的详细说明 三、SpringBoot 项目中引入 WebSocket3.1 创…...

Java应用CPU占用过高故障排除

一、背景 最近测试反馈测试环境接口偶现有访问超时&#xff0c;然后APP提示是网络失败&#xff0c;看了一下测试环境的应用完全没啥问题&#xff0c;一直以为是网络问题。 今天测试有反馈了&#xff0c;赶紧看了一下测试服务器&#xff0c;这次终于有症状了&#xff0c;CPU直…...

嵌入式Linux开发实操(十五):nand flash接口开发(2)

通用NAND驱动程序支持几乎所有基于NAND的芯片,并将它们连接到Linux内核的内存技术设备(MTD)子系统。这个接口走的是nand的并口,可以在shell的/dev中看到设备,比如/mtd0、/mtd0ro…,mtdblock0、mtdblock1… sysfs在设备层次结构中提供了几个视角。设备必须挂在某条总线bus…...

作为一家游戏开发公司,有哪些经验可以分享?

在竞争激烈的游戏开发行业中&#xff0c;成功的游戏开发公司需要不断学习、创新和积累经验。作为一家经验丰富的游戏开发公司&#xff0c;我们愿意分享一些我们认为对于取得成功至关重要的经验和教训。这些经验涵盖了游戏开发的各个方面&#xff0c;从创意构思到发布和营销。希…...

【100天精通Python】Day51:Python 数据分析_数据分析入门基础与Anaconda 环境搭建

目录 1 科学计算和数据分析概述 2. 数据收集和准备 2.1 数据收集 2.1.1 文件导入&#xff1a; 2.1.2 数据库连接&#xff1a; 2.1.3 API请求&#xff1a; 2.1.4 网络爬虫&#xff1a; 2.2 数据清洗 2.2.1 处理缺失值&#xff1a; 2.2.2 去除重复值&#xff1a; 2.2…...

网络安全(黑客)自学路线

很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习&#xff0c;最终也只是会无疾而终&#xff01;黑客是一个大的概念&#xff0c;里面包含了许多方向&#xff0c;不同的方向需要学习的内容也不一样。 算上从学校开始学习&#xff0c;已经在网安这条路上走…...

HTML5

写在前面 一、简单认识HTML 1.1 什么是网页【2023/08/31】 网站是指因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的…...

Vue+Element-ui实现表格本地导入

表格文件存储在前端 如图&#xff0c;表格文件template.xlsx存储在public下的static文件夹下 注意这里的路径容易报错 a链接下载文件失败的问题(未发现文件&#xff09; a.href ‘./static/template.xlsx’ 写的时候不能带public&#xff0c;直接这么写就可以 DownloadTemp…...

Golang参数输入

Golang参数输入 1.命令行参数&#xff08;os.Args&#xff09; package mainimport ("fmt""os""strconv" )func main() {for i, num : range os.Args[1:] {fmt.Println("参数"strconv.Itoa(i)": ", num)} } //输入&#x…...

2023年8月第4周大模型荟萃

2023年8月第4周大模型荟萃 2023.8.31版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、美国法官最新裁定&#xff1a;纯AI生成的艺术作品不受版权保护 美国华盛顿一家法院近日裁定&#xff0c;根据美国政府的法律&#xff0c;在没有任何…...

Kafka监控工具,LinkedIn详解

Kafka监控工具包括以下几种&#xff1a; Kafka Manager&#xff1a;这是一个开源的Kafka集群管理工具&#xff0c;可以监控Kafka集群的健康和性能&#xff0c;并提供可视化的用户界面。 Kafka Monitor&#xff1a;这是LinkedIn开发的一个监控工具&#xff0c;可以监控Kafka集群…...

如何处理 Flink 作业频繁重启问题?

分析&回答 Flink 实现了多种重启策略 固定延迟重启策略&#xff08;Fixed Delay Restart Strategy&#xff09;故障率重启策略&#xff08;Failure Rate Restart Strategy&#xff09;没有重启策略&#xff08;No Restart Strategy&#xff09;Fallback重启策略&#xff…...

Windows 安装 RabbitMq

Windows 上安装 RabbitMQ 的步骤 RabbitMQ 是一个强大的开源消息队列系统&#xff0c;广泛用于构建分布式、可扩展的应用程序。本教程将带您一步一步完成在 Windows 系统上安装 RabbitMQ 的过程。无需担心&#xff0c;即使您是初学者&#xff0c;也能够轻松跟随这些简单的步骤…...