ArrayList与LinkList的区别

ArrayList底层的实现是Array, 数组扩容实现

  •  新增数据空间判断,  新增数据的时候需要判断当前是否有空闲空间存储
  • 扩容需要申请新的连续空间,把老的数组复制过去

  • 新增新的内容, 回收老的数组空间

LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能, 但是再查找方面弱于ArrayList, 当然,这些对比都是指数据量很大或者操作很频繁

 链表不需要连续的空间, 大小不确定

 1. 底层实现

ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;

2. 时间复杂度

操作            数组    链表
随机访问    O(1)     O(N)
头部插入    O(N)    O(1)
头部删除    O(N)    O(1)
尾部插入    O(1)     O(1)
尾部删除    O(1)     O(1)
查询对象所在索引 O(n) O(n)

查询对象所在索引时间复杂度都是O(N)

  • 数组要比链表快因为数组的连续内存, 会有一部分或者全部数据一起进入到CPU缓存, 而链表还需要在去内存中根据上下游标查找, CPU缓存比内存块太多
  • 从源码可以看出,ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,比如index < size / 2,则从左边开始查找,反之从右边开始查找,但是还是比ArrayList要慢。这点是毋庸置疑的。
  • ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。这就导致了两者并非一定谁快谁慢

 3. 空间复杂度

在LinkedList中有一个私有的内部类,定义如下:

private static class Entry {
         Object element;
         Entry next;
         Entry previous;
     }

  • 如果有1000个元素的LinkedList对象将有1000个链接在一起的Entry对象,每个对象都对应于列表中的一个元素。这样的话,在一个LinkedList结构中将有一个很大的空间开销,因为它要存储这1000个Entity对象的相关信息。
  • ArrayList使用一个内置的数组来存储元素,这个数组的起始容量是10.当数组需要增长时,新的容量按如下公式获得:新容量=(旧容量*3)/2+1,也就是说每一次容量大概会增长50%。这就意味着,如果你有一个包含大量元素的ArrayList对象,那么最终将有很大的空间会被浪费掉,这个浪费是由ArrayList的工作方式本身造成的。如果没有足够的空间来存放新的元素,数组将不得不被重新进行分配以便能够增加新的元素。对数组进行重新分配,将会导致性能急剧下降。如果我们知道一个ArrayList将会有多少个元素,我们可以通过构造方法来指定容量。我们还可以通过trimToSize方法在ArrayList分配完毕之后去掉浪费掉的空间

ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

实际开发中怎么选择?

1、如果你十分确定你插入、删除的元素是在前半段,使用LinkedList
2、如果你十分确定你删除、删除的元素后半段,使用ArrayList
3、如果你上面的两点不确定,建议你使用LinkedList

说明:
1)、LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;
2)、插入元素的时候,弄得不好ArrayList就要进行一次扩容,而ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作,所以综合来看就知道选择哪个类型的list

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

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

相关文章

刷题记录|Day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

● 198.打家劫舍 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给…

如何选择理想的三相浪涌保护器?

每个电气系统都需要各种组件来控制和保护电流&#xff0c;因为电力使用不当是会危及生命安全的&#xff0c;但是电的存在也使得科技和社会的进步便捷&#xff0c;生活更加便捷高效。 由于技术的进步&#xff0c;现在需要新型的SPD浪涌保护器&#xff0c;地凯科技三相浪涌保护器…

【vSphere | Python】vSphere Automation SDK for Python Ⅲ—— vCenter Datacenter APIs

目录5. vCenter Datacenter APIs操作5.1 Create Datacenter5.2 List Datacenter5.3 Get Datacenter5.4 Delete Datacenter参考资料5. vCenter Datacenter APIs 数据中心服务&#xff08;Datacenter service&#xff09;提供管理 vCenter Server 中数据中心的操作。 操作 Cre…

为什么无法跨centos、ubuntu、rocky linux 发行版本进行系统升级?

本文原地址: http://feitianzhi.com/boke/index.php/archives/56/ 转载请注明出处,有疑问或错误请发邮件到xiaozhifslib.org 背景 linux分为很多发行版本&#xff0c;发行版本的内核可以升级&#xff0c;比如centos7可以使用kernel 4.*,5.的内核&#xff08;官方默认为3.&…

xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享

缺失了xinput1_3.dll文件&#xff0c;对应用程序或游戏的正常运行造成了严重的影响。这个动态链接库文件&#xff08;DLL&#xff09;是由Microsoft Corporation开发的&#xff0c;它是一个重要的Windows系统文件&#xff0c;提供了针对Xbox 360控制器的输入支持。如果这个文件…

释放AIoT商业价值 | 2023高通广和通智能物联网技术开放日圆满落幕

数字经济迸发澎湃动能&#xff0c;万物智联融入千行百业&#xff0c;成为推动经济增长的重要引擎。为深入探讨AIoT前沿变革技术与行业创新&#xff0c;3月30日&#xff0c;2023高通&广和通智能物联网技术开放日于上海顺利举办&#xff0c;来自高通和广和通的多位高层领导、…

22.SSM-JdbcTemplate总结

目录 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 &#xff08;2&#xff09;JdbcTemplate常用操作。 &#xff08;3&#xff09;知识要点。 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 这个是Sp…

贯穿设计模式第二话--开闭职责原则

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…

区块链学习笔记(3)BTC协议

假设有一个大家都信任的中心化机构想要发行数字货币。 该机构由用自己的私钥签名后后发行&#xff0c;任何人都可以通过公钥验证该货币是否为真。 买东西的时候&#xff0c;购买者可以将数字货币发送给卖方&#xff0c;卖方可以也可以通过公钥验证该货币为真后即可完成支付的过…

运算符重载

概念&#xff1a;对已有运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 目录 一、加号运算符重载 分类&#xff1a; ①成员函数重载号 ②全局函数重载号 二、左移运算符重载 作用&#xff1a;以输出自定义数据类型 三、递增运算符重…

【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

目录 ID select_type 查询类型 table 表名 type 关联类型/访问类型 possible_keys MySQL觉得可能要用到的索引 key 实际用到的索引 key_len 用到的索引的长度&#xff08;比如可用于判断使用了联合索引中的哪几个&#xff09; ref 表查找值所用的列&#xff08;表名.字…

【刷题笔记】笔记三

凑算式&#xff08;蓝桥真题&#xff09;题目&#xff1a;注意&#xff1a;需要通分&#xff0c;有些时候除不尽需要通分。源码&#xff1a;方法一&#xff1a;递归回溯全排列int ret 0; #define MAX 9 //多少个全排列 int a[MAX];//排列数组 bool flag[MAX];//标记数组int n …

cuda学习4-6

4. Hardware Implementation NVIDIA GPU架构是围绕一系列可扩展的多线程流式多处理器&#xff08;SM&#xff09;构建的。当主机CPU上的CUDA程序调用内核网格时&#xff0c;网格的块将被枚举并分配给具有可用执行能力的多处理器。线程块的线程在一个多处理器上并发执行&#x…

Shell脚本之数组向函数传参

一、向函数传数组参数 如果将数组作为函数的参数&#xff0c;函数只会取数组变量的第一个值 1、格式 #!/bin/bash #数组在函数中传参test() {echo "函数接收到的参数列表为&#xff1a;$" newarr($*)echo "新数组的值为&#xff1a;${newarr[]}" }#####…

理解 arp以及大致的原理 + 存在的安全隐患

ARP原理 ARP协议是地址解析协议&#xff08;Address Resolution Protocol&#xff09;是通过解析IP地址得到MAC地址&#xff0c;所有ARP协议在网络层被应用&#xff0c;它是网络层与链路层连接的重要枢纽 每台主机都会在自己的ARP缓冲区中建立一个ARP列表&#xff0c;ARP列表表…

0115 用户管理

1.关机、重启命令 shutdown -h now 立刻进行挂机&#xff08;hhalt 停止&#xff09; shutdown -h 1 1分钟后关机&#xff08;默认&#xff09; shutdown -r now 重启 halt 关机 reboot …

关于TextureRender适配的解决方案

当我们用摄像机渲染出一个图片&#xff0c;显示在UI的时候&#xff0c;会发现&#xff0c;你如果自适配&#xff0c;那么就会拉伸图片&#xff0c;导致人物或者场景变形。 我最近就遇到了这个事&#xff0c;这里我给出几种问题和解决方案&#xff1a; 1 &#xff1a;当我们想…

Sentinel入门使用

目录快速开始demoSentinelResource引入sentinel控制台集成spring cloud创建父工程sentinel工程spring-cloud工程client微服务工程server微服务工程测试总结快速开始 demo <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core&…

Linux系统【centos7】怎么手动部署网站?

要手动部署网站在CentOS 7系统上&#xff0c;请按照以下步骤操作&#xff1a; 1. 安装Apache服务器 在终端中使用以下命令安装Apache服务器&#xff1a; sudo yum install httpd 2. 配置防火墙 设置防火墙规则以允许HTTP和HTTPS流量&#xff1a; sudo firewall-cmd --perm…

台灯学生用哪个牌子最好?精选学生专用台灯第一品牌

许多人知道&#xff0c;在我国普遍有有个现象&#xff0c;学生除了每天上下课&#xff0c;还有一系列的补习班、兴趣班&#xff0c;放学后的课后作业也是非常多&#xff0c;这就是现代学生的学习情况&#xff0c;随着双减政策出现&#xff0c;儿童的学习任务重&#xff0c;父母…
最新文章