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.mfbz.cn/a/601122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HBase 读写流程

HBase 读写流程 1. 读流程 Client先访问zookeeper,从zookeeper获取meta region的位置从meta region中读取meta表中的数据,meta中存储了用户表的region信息;根据namespace、表名和rowkey在meta表中找到对应的region信息;找到这个r…

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目: 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置,完成设置。 添加依赖: 如果你的库需要额外的依赖,可以在 build.gradle (Module: app…

文件各种上传,离不开的表单 [html5]

作为程序员的我们,经常会要用到文件的上传和下载功能。到了需要用的时候,各种查资料。有木有..有木有...。为了方便下次使用,这里来做个总结和备忘。 利用表单实现文件上传 最原始、最简单、最粗暴的文件上传。 前端代码: //方…

oracle 清理 trace 和 alert 日志文件

某天,发现磁盘空间被占满了,继续查询发现是 oracle 的日志文件占满了磁盘空间 其中: trace文件有35G, alert 有23G 目录地址是: diag/rdbms/orcl/orcl/trace, diag/rdbms/orcl/orcl/alert 都是在 oracle 目录下的 diag 目录内部 # 可以使用 以下命令对目录大小进行排…

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

视频剪辑图文实例:一键操作,轻松实现视频批量片头片尾减时

视频剪辑是现代媒体制作中不可或缺的一环,而批量处理视频更是许多专业人士和爱好者的常见需求。在剪辑过程中,调整视频的片头片尾时长可以显著提升视频的质量和观感。本文将通过图文实例的方式,向您展示如何一键操作,轻松实现视频…

借助Aspose.SVG图像控件,在线将 PNG 转换为 Base64 字符串

Aspose.SVG for .NET 是用于SVG文件处理的灵活库,并且与其规范完全兼容。API可以轻松加载,保存和转换SVG文件,以及通过其文档对象模型(DOM)读取和遍历文件的元素。API独立于任何其他软件,使开发人员无需使用…

jenkins+gitlab+ansible-tower实现发布

前提准备: gitlab中上传相应的jenkinsfile文件和源码。 安装和破解ansible-tower。 安装jenkins。 大致流程:从gitlab中拉取文件,存放到windows机器上,使用nuget等进行打包到windows中,使用sshPublisher语句传输到远程…

必应bing国内广告怎么做付费推广,提升产品曝光?

必应Bing作为微软旗下重要的搜索引擎平台,拥有着不可忽视的用户基础和市场潜力。对于寻求拓宽市场、提高品牌知名度的企业而言,利用必应Bing进行付费推广无疑是明智之选。通过必应Bing国内广告进行高效付费推广,助您轻松提升产品曝光度。 一…

windows vscode设置扩展和缓存目录

vscode的扩展和缓存占了很大的空间,而且默认在C盘,很烦。。。 修改vscode快捷方式的目标处:"C:\Users\Nv9\AppData\Local\Programs\Microsoft VS Code\Code.exe" --extensions-dir "D:\Program Cache\VScode\extensions"…

Ansible Playbook关键字 | 快速入门 | 案例教程

一、【写在前面】 1. 废话 笔者最近在规划写几篇连续的文章,想来想去还是Ansible最值得记录: 一来是此工具学习曲线比较平缓,不会一看文档就不想学了,早期学习性价比非常高; 其次、这个东西基本都要用到,…

QT和Halcon联合编程--注意是Ubuntu--

1.在QT目录下面的.pro文件下,如图所示: 根据你电脑的haclon的安装路径,添加如下代码: INCLUDEPATH /opt/halcon/include LIBS -L/opt/halcon/lib/x64-linux -lhalconcpp 需要等待一下,QT需要进行加载 2.在头文件中…

商家制作微信小程序有什么好处?微信小程序的制作有哪些步骤和流程

微信小程序全面指南 微信小程序是微信生态系统中一项革命性的功能,为希望与庞大的微信用户群体互动的企业提供了独特的融合便捷性和功能性的体验。本全面指南深入探讨了微信小程序的世界,强调了其重要性、工作原理以及实际用例,特别是针对企…

金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道

金仓面对面 在数字化浪潮的推动下,人大金仓携手行业先锋,共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话,更是一次智慧的火花碰撞,一次行业数字化转型洞察的深度挖掘。 行业精英汇聚:我们荣幸…

R语言数据探索与分析-中国GDP回归分析与预测

首先读取数据: 将GDP列转换为常规数字格式 # 可视化GDP数据 # 查看数据结构 # 确保数据类型是正确的 第一张图片展示了中国2002年到2021年间的GDP增长趋势,这是一个时间序列图,其中横轴表示年份,纵轴表示GDP(单位未…

idea提示 CreateProcess error=206, 文件名或扩展名太长有哪些具体的解决方法

背景: 项目启动后提示CreateProcess error206,通常我本地是将shorten command line改成如下就可以解决,但是今天遇到一个,无论这里怎么设置都是启动提示扩展名太长,经过一番处理问题终于解决,特此记录一下。…

stm32之hal库spi驱动封装(实现阻塞,中断,dma三种方式)

前言 配置功能参考rt-thread驱动代码将中断配置和dma配置单独分开管理 代码 中断管理 头文件 /** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2024-5-3 shchl first version*/#ifnd…

有哪些软件可以使用云渲染?

随着技术的发展,云渲染已成为动画制作人员与设计师重要的渲染助手。它可结合云端强大的计算机能力,帮助渲染人员高速的完成渲染任务,大幅度节省时间和本地计算资源。它们以用户友好的界面、强大灵活的渲染能力,满足了各类专业渲染…

ESP8266固件烧写

概述 因为手上有块闲置的ESP8266开发板,想着拿来倒腾一下WIFI探针,倒腾了一阵测试成功,博文记录用以备忘 硬件 ESP8266 NodeMCU 环境 Windows 11 步骤 1.下载esp32_win32_msys2_environment_and_toolchain-20181001.zip 2.下载xtensa…

Facebook革命:数字社交的全新篇章

随着互联网的不断普及和科技的飞速发展,社交媒体已经成为现代社会不可或缺的一部分。在众多社交媒体平台中,Facebook以其广泛的用户群体和强大的功能而备受瞩目。然而,Facebook并非止步于现状,而是正在掀起一场数字社交的革命&…
最新文章