List的两种实现

前置知识:

数组

baseAddress:数组的首地址

dataTypeSize:数组中元素类型的大小,如int为4字节

为什么数组索引从0开始,假如从1开始不行吗?

在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引*存储数据的类型大小

这样对于CPU来说,增加了一个减法指令,影响性能

时间复杂度

随机查找(通过下标)时间复杂度O(1)

查找元素(未知下标)时间复杂度O(n)

查找元素(未知下标但排序)通过二分查找的时间复杂度O(logn)

插入元素和删除元素的时候,为了保证数组的内存连续性,需要挪动数组元素,平均时间复杂度为O(n)

ArrayList

源码分析【jdk8】

elementData 为数组,我们所有的操作都在该数组上

无参构造的时候调用的是DEFAULTCAPACITY_EMPTY_ELEMENTDATA

有参构造的时候调用的是EMPTY_ELEMENTDATA

以上两个集合虽然都为空集合,但是在后续判断的时候用来做区分【下面有代码】

区分我这个集合是通过有参(大小为0)创建的还是无参创建的,如果是无参的,那么我第一次计划会和default_capacity(10)进行比较,如果是有参的,则直接返回size+1

第一次添加数据的时候,即假设我们是通过无参构造生成的ArrayList【数组容量为0,因为空数组,size为0】,然后往里面第一次加数据的时候,会先去调用ensureCapacityInternal方法,将成员变量elementData和minCapacity传进去,因为elementData是通过无参构造器(赋的值),所以此时elementData == defaultCapacity_EMPTY_elmentdata,所以判断,如果size+1比10(默认的)小,则计划容量为10,否则计划至size+1。计划完成之后,还需要确保容量是否够,调用ensureExplicitCapacity,够用则不会扩容,正常情况下1-10次add都不会扩容,第十一次的时候,每次扩容为原来的1.5(接近)倍(增加原来的一半,如果是奇数会缺失小数部分)

ArrayList底层的实现原理:

ArrayList list = new ArrayList(10) 中list扩容了几次?

该语句中只是声明和实例了一个ArrayList,指定了容量为10,未扩容。

如何实现数组和List之间的转换?


数组转换成List:调用数组的静态方法 Arrays.asList(数组名) 【该方法转成的集合不可变】

使用JDK中java.util.Arrays工具类的asList方法

List转换成数组:使用List的toArray方法。toArray方法返回Object数组,传入类型和长度。

Arrays.asList转换List之后,如果修改了数组的内容,list会受到影响,因为它的底层集合的构造器中,把我们传入的这个集合进行了包装而已,最终它们指向的都是同一个内存地址。

toArray转数组后,如果修改了list内容,数组不会受影响,当调用toArray后,底层进行了数组的拷贝,跟原来的元素没关系(new了一个新的)

ArrayList和LinkedList区别?

底层数据结构:

ArrayList是动态数组的数据结构实现【动态是因为进行扩容,然后进行拷贝】

LinkedList是双向链表的数据结构实现

操作数据效率:

ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】,LinkedList不支持下标查询

查找(未知索引):ArrayList需要遍历,链表也需要遍历,时间复杂度都是O(n)

新增和删除

ArrayList尾部插入和删除,时间复杂度未O(1);其他部分增删需要挪动数组,时间复杂度为O(n)

LinkedList头尾接待你增删时间复杂度是O(1)【双向链表】,其他都需要遍历链表,时间复杂度O(n)

内存空间占用

ArrayList底层是数组,内存连续,节省内存

LinkedList是双向链表需要存储数据和两个指针,更占用内存

线程安全

ArrayList和LinkedList都不是线程安全的

如果需要保证线程安全,有两种方案

1.在方法内使用,局部遍历是线程安全的

2.使用线程安全的ArrayList和LinkedList【使用Collections下的synchroniedList封装】当然性能会低

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

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

相关文章

JAVA随记——集合篇

注意:作者之前的Java基础没有打牢,有一些知识点没有记住,所以在学习中出现了许多零散的问题。现在特地写一篇笔记总结一下,所以有些知识点不是很齐全。 集合中各类名词的关系 Collection集合为单列集合。 集合存储数据类型的特点…

森林消防—高扬程水泵,高效、稳定、可靠!/恒峰智慧科技

森林,作为地球的“绿色肺叶”,不仅为我们提供了丰富的自然资源,更是维持生态平衡的重要一环。然而,随着全球气候的变化和人为活动的增加,森林火灾频发,给生态环境和人民生命财产安全带来了巨大威胁。在森林…

与时代同行,Build with AI 2024 线下活动五月再次开放报名

技术开发日新月异,软硬件迭代和应用场景多样化对开发者提出了更多挑战。面对科技发展潮流,GDG (谷歌开发者社区) 一直秉承开放共创的精神,以热忱之心与开发者们一同探索 AI 的广阔发展前景。 在过去的四月里,我们在北京、上海、深…

php使用服务器端和客户端加密狗环境部署及使用记录(服务器端windows环境下部署、linux环境宝塔面板部署、客户端部署加密狗)

php使用服务器端和客户端加密狗环境部署及使用记录 ViKey加密狗环境部署1.windows环境下部署开发文档验证代码提示Fatal error: Class COM not found in 2.linux环境下部署(宝塔面板)开发文档验证代码提示Fatal error: Uncaught Error: Call to undefine…

加速乐 js解混淆 __jsl_clearance_s生成

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,如有侵权,可联系本文作者删除! 目标网站 aHR0cHM6Ly9jcmVkaXQuaGVmZWkuZ292LmNuL2NyZWRpdC13…

聚观早报 | 比亚迪首款新能源皮卡;苹果M4芯片有望登场

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 5月8日消息 比亚迪首款新能源皮卡 苹果M4芯片有望登场 红旗首款手机外观揭晓 一加13设计细节曝光 长城汽车4月销…

matlab 基于拉依达检验法(3σ准则) 实现多类别多参数的批量异常样本检验 V2.0

简介 拉依达检验法(3σ准则)是一种统计学方法,用于检测数据中的异常值。这种方法基于正态分布的特性来确定数据点是否可能是异常值。以下是关于拉依达检验法(3σ准则)的详细介绍: 基本原理: 拉…

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块(ESM)语法,preload.js一直加载不到,报错如下: VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

3D相机及应用

无论是2D相机和3D相机,在工业应用中都有着不可或缺的作用。3D相机与2D相机的最大区别在于,3D相机可以获取真实世界尺度下的3D信息,而2D相机只能获取像素尺度下的2D平面图像信息。通过3D相机得到的数据,我们可以还原出被测量物体的…

FX110书籍推荐:如何快速成为一名专业股票投资人?

股票投资领域有一本神作《股票交易入门》,它是股票从业人员的入门必备书籍。 关于股票入门的书籍很多,但这本书涉及的知识面最全、实用性最强。从这本书里,我们可以领略到股票交易世界的跌宕起伏而又波澜壮阔的魅力。本书作者 本书的作者是美…

Android studio 打开Device Mirroring方便调试

巧合下发现一个很好用的工具,在平时调试真机的时候在每次run app后都要低头找找手机看看效果。但是,用了AS上的Device Mirroring,你会发现根本不需要再低头点手机,调试方便一万倍啊。 话不多说,上图。直接就可以在电脑…

第二篇【传奇开心果系列】Python深度学习库技术点案例示例:深度解读深度学习在语音助手方面的应用

传奇开心果博文系列 系列博文目录Python深度学习库技术点案例示例系列 博文目录前言一、深度学习在语音助手方面的应用介绍二、语音识别示例代码三、语义理解示例代码四、对话生成示例代码五、个性化服务示例代码六、多模态交互示例代码七、情感识别示例代码八、知识点归纳 系列…

车间移动环保空调降温通风设备

移动环保空调的特点主要体现在以下几个方面: 环保节能:移动环保空调通常采用水冷技术,无需使用化学制冷剂,符合环保要求。同时,其高效节能的设计能有效降低能耗,节约能源。快速降温:移动环保空…

图搜索算法 - 拓扑排序

相关文章: 数据结构–图的概念 图搜索算法 - 深度优先搜索法(DFS) 图搜索算法 - 广度优先搜索法(BFS) 拓扑排序 概念 几乎所有的工程都可分为若干个称作活动的子工程,而这些子工程之间,通常受…

UART、TIMER

UART简介(通用异步收发器,通常称串口) UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。 UART作为异步串行通信协议的一种,工作原理是将传输数据的每个二进制位一位接一位地传输。…

JavaScript:正则表达式属于字符串吗-不属于/字符串转正则表达式的两种方法

一、需求描述 js 字符串转正则表达式 二、理解正则表达式属于字符串吗? 正则表达式不属于字符串,它是一种用于匹配、查找和操作文本的模式。正则表达式是一种特殊的语法,用于描述字符串的特征。通过使用正则表达式,可以检查一个字符串是否…

刷题之最爱的城市(卡码网,图论)

最爱的城市 #include<vector> #include<climits> #include<iostream> using namespace std; int path 0; void dfs(vector<vector<int>>& city, vector<bool>& visited, int city2, int startindex, int* result) {if (startinde…

[数据概念|方案实操][最新]数据资产入表4月速递

“ 在各地数据资产变现“热辣滚烫”” 国家数据局全国数据工作会议前后&#xff0c;数据资源“入表”的尝试在各地持续热火朝天地展开&#xff0c;多地实现数据资产入表和利用数据资产进行融资实现“零的突破”。 我们今天就把4月前后的案例做一个小结&#xff0c;之前的案例大…

基于大数据+Hadoop的豆瓣电子图书推荐系统实现

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 基于大数…

Pascal Content数据集

如果您想使用Pascal Context数据集&#xff0c;请安装Detail&#xff0c;然后运行以下命令将注释转换为正确的格式。 1.安装Detail 进入项目终端 #即 这是在我自己的项目下直接进行克隆操作&#xff1a; git clone https://github.com/zhanghang1989/detail-api.git $PASCAL…