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修饰不可变,不可增删改。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell自动化日志维护脚本

简介&#xff1a; 系统日志对于了解操作系统的运行状况、故障排除和性能分析至关重要。然而&#xff0c;长期积累的日志文件可能变得庞大&#xff0c;影响系统性能。在这篇文章中&#xff0c;我们将介绍一个自动化的解决方案&#xff0c;使用 Bash 脚本来监控和维护系统日志文件…

ZooKeeper数据模型/znode节点深入

1、Znode的数据模型 1.1 Znode是什么&#xff1f; Znode维护了一个stat结构&#xff0c;这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起&#xff0c;可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化&#xff0c;版本号就增加。…

【微服务】服务发现和管理技术框架选型调研

选型背景 方案对比 结论 结合实际业务和开发需要&#xff0c;着重考虑性能可靠性、功能和社区支持程度三方面&#xff0c;认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下&#xff1a; 性能更好&#xff0c;可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…

【Hadoop】DataNode 详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Keil 编译 Debug

# 头文件无法导入进来 # 导入头文件&#xff0c;只有函数声明&#xff0c;但缺少函数实现 已经导入了air32f10x_gpio.h但是没有导入 .c&#xff0c;就导致 编译出错出现undefined symbol (某个函数)&#xff0c;这时候按照下面的操作&#xff0c;导入外设模块就好。

HarmonyOS开发:探索动态共享包的依赖与使用

前言 所谓共享包&#xff0c;和Android中的Library本质是一样的&#xff0c;目的是为了实现代码和资源的共享&#xff0c;在HarmonyOS中&#xff0c;给开发者提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;H…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时&#xff0c;需要计算两个日期之间相隔的秒数&#xff0c;我在写的时候直接将两个日期进行相减&#xff0c;得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试&#xff0c;得出的结论是&#xff1a;如果日期类型直接相减&#…

“亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展

生成式AI技术飞速发展&#xff0c;颠覆着人们的生活&#xff0c;正在掀起新一轮的科技革命。在生成式AI的浪潮中&#xff0c;亚马逊云科技旨在为中国的优秀初创企业提供全方位支持&#xff0c;助其抢占先机。 在6月底举办的亚马逊云科技中国峰会上&#xff0c;亚马逊云科技联合…

com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析

组件简介 维护者square组织许可证类型Apache License 2.0首次发布2016 年 1 月 2 日最新发布时间2023 年 4 月 23 日GitHub Star44403GitHub Fork9197依赖包5,582依赖存储库77,217 com.squareup.okhttp3:okhttp 一个开源的 HTTP 客户端库&#xff0c;可以用于 Android 和 Jav…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目&#xff0c;来演示CocosCreator 的项目结构。 等待创建完成后&#xff0c;会得到以下项目工程&#xff1a; 一、assets文件夹 assets文件夹&#xff1a;为资源目录&#xff0c;用来存储所有的本地资源&#xff0c;如各种图片&#xff0c;脚本…

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

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

【算法笔记】二维的哈希与迭代转换;Runtime Error 的解决思路

https://vjudge.net/problem/UVA-11019 如何对一个二维数组进行哈希 对于一个一维数组A(1*M)&#xff0c;哈希的方式是&#xff1a; s e e d M − 1 ∗ A [ 0 ] s e e d M − 2 ∗ A [ 1 ] s e e d M − 3 ∗ A [ 2 ] . . . s e e d 0 ∗ A [ M − 1 ] seed^{M-1}*A[0] …

Python安装与Pycharm配置

Python与Pycharm安装 用了一年的Python最近被一个问题难倒了&#xff0c;pip安装一直不能用&#xff0c;报错说被另一个程序使用。被逼到只能重新安装python了&#xff0c;正好记录一下这个过程&#xff0c;写这篇笔记。&#xff08;突然想到可能是配Arcgis的python接口&#…

微信小程序修改vant组件样式

1 背景 在使用vant组件开发微信小程序的时候&#xff0c;想更改vant组件内部样式&#xff0c;达到自己想要的目的&#xff08;van-grid组件改成宫格背景色为透明&#xff0c;默认为白色&#xff09;&#xff0c;官网没有示例&#xff0c;通过以下几步修改成功。 2 步骤 2.1 …

【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

MSK 在数字调制中&#xff0c;最小频移键控&#xff08;Minimum-Shift Keying&#xff0c;缩写&#xff1a;MSK&#xff09;是一种连续相位的频移键控方式&#xff0c;在1950年代末和1960年代产生。与偏移四相相移键控&#xff08;OQPSK&#xff09;类似&#xff0c;MSK同样将…

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

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

基于 Zookeeper 实现服务注册和服务发现

文章目录 前言声明前置知识服务注册和发现Zookeeper 工作原理实现过程注册中心服务注册服务发现 总结 前言 无论是采用SOA还是微服务架构&#xff0c;都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑&#xff0c;现…

【Elsevier旗下】中科院1区TOP,影响因子9分+,23天录用!极速见刊!

极速见刊推荐 中科院 1区&#xff08;TOP&#xff09; 出版社&#xff1a;Elsevier 影响因子&#xff1a;IF&#xff08;2022&#xff09;9.0-10.0 期刊分区&#xff1a;JCR1区&#xff0c;中科院1区&#xff08;TOP&#xff09; 检索情况&#xff1a;SCIE 在检&#xff…

微服务之架构演变

随着互联网的发展&#xff0c;网站应用规模不断扩大&#xff0c;网站架构随之不断演变&#xff0c;演变历史大致分为单体应用架构-垂直应用架构-分布式架构-SOA架构-微服务架构-云原生架构 架构演变 单体应用架构 以前网站流量小&#xff0c;只需要一个应用就可以把所有功能…