-
数组为什么随机增删比较慢?
2021-03-23 14:41:03原因是为什么呢 1.数组是一个有序列表 ,数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移 举个例子: Public class Test(){ public static void main (Stirng[args]...首先,我们都知道数组和数组列表的随机访问和迭代操作是很快的,但是他们两个都有一个重大的缺陷:增加一个元素或者删除一个元素的开销很大。原因是为什么呢
1.数组是一个有序列表 ,数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移 举个例子:Public class Test(){ public static void main (Stirng[args]){ List<String> list = new ArrayList<String>(); list.add("a"); //0 list.add("b"); //1 list.add("c"); //2 list.add("d"); //3 list.add("e"); //4 list.add("f"); //5 //我们把索引为2的元素删掉 list.remove(2); //然后我们在输出一下 就会发现原来索引为2的元素"c"在被删除后 原来的索引3的元素前移 System.out.println(list.get(2)); System.out.println(list.get(3)); System.out.println(list.get(4)); //输出的结果为 d e f } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
如果感觉还不够清晰的话 我们来画个图:
增加同理,但是索引是右移的在java中还有一个数据结构—链表(LinkedList)解决了这个问题,链表存放对象是放入到一个单独的链接(link)中,链接中还存放这下一个链接的引用,在java语言设计中链表都是双向链接(Double linked)—即每个对象都还存放这前驱的引用
————————————————
版权声明:本文为CSDN博主「小林带程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46070645/article/details/106048143 -
为什么数组的增删慢,而链表的增删快?
2020-05-11 10:27:08原因是为什么呢 1.数组是一个有序列表 ,数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移 举个例子: Public class Test(){ public static void main (Stirng[args...首先,我们都知道数组和数组列表的随机访问和迭代操作是很快的,但是他们两个都有一个重大的缺陷:增加一个元素或者删除一个元素的开销很大。原因是为什么呢
1.数组是一个有序列表 ,数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移 举个例子:Public class Test(){ public static void main (Stirng[args]){ List<String> list = new ArrayList<String>(); list.add("a"); //0 list.add("b"); //1 list.add("c"); //2 list.add("d"); //3 list.add("e"); //4 list.add("f"); //5 //我们把索引为2的元素删掉 list.remove(2); //然后我们在输出一下 就会发现原来索引为2的元素"c"在被删除后 原来的索引3的元素前移 System.out.println(list.get(2)); System.out.println(list.get(3)); System.out.println(list.get(4)); //输出的结果为 d e f } }
如果感觉还不够清晰的话 我们来画个图:
增加同理,但是索引是右移的在java中还有一个数据结构—链表(LinkedList)解决了这个问题,链表存放对象是放入到一个单独的链接(link)中,链接中还存放这下一个链接的引用,在java语言设计中链表都是双向链接(Double linked)—即每个对象都还存放这前驱的引用
-
数组和链表区别?为什么链表查找慢?数组查找快?为什么连续内存就方便查找?
2020-01-30 21:22:39优点:使用方便 ,查询效率 比链表高,内存为一连续的区域 缺点:大小固定,不适合动态存储,不方便动态添加 链表: 优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式存储。 ...数组与链表的优缺点;
数组:
优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式存储。
缺点:只能通过顺次指针访问,查询效率低链表和数组的本质差异
1 在访问方式上
数组可以随机访问其中的元素
链表则必须是顺序访问,不能随机访问
2 空间的使用上
链表可以随意扩大
数组则不能从CPU的角度
CPU 寄存器 – immediate access (0-1个CPU时钟周期)
CPU L1 缓存 – fast access (3个CPU时钟周期)
CPU L2 缓存 – slightly slower access (10个CPU时钟周期)
内存 (RAM) – slow access (100个CPU时钟周期)
硬盘 (file system) – very slow (10,000,000个CPU时钟周期)各级别的存储器速度差异非常大,CPU寄存器速度是内存速度的100倍! 这就是为什么CPU产商发明了CPU缓存。 而这个CPU缓存,就是数组和链表的区别的关键所在。
CPU缓存会把一片连续的内存空间读入,因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面,平均读取 每个元素的时间只要3个CPU时钟时间。而链表的节点分散在堆空间里面,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)
总结一下, 各种存储器的速度差异很大,在编程中绝对有必要考虑这个因素。 比如,内存速度比硬盘快1万倍,所以程序中应该尽量避免频繁的硬盘读写;CPU缓存比内存快几十倍,在程序中尽量多加利用。
CPU性能衡量参数-主频,MIPS,CPI,时钟周期,机器周期,指令周期
1,主频主频 = 时钟频率,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍;
时钟频率又称主频,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍;
2,时钟周期
时钟周期 t =1/ f; 主频的倒数
3,机器周期
机器周期 = m*t ;一个机器周期包含若干个时钟周期
4,指令周期
指令周期 = m*t*n; 执行一条指令所需要的时间,一般包含若干个机器周期
5,CPI
CPI = m*n; 平均每条指令的平均时钟周期个数
指令周期 = CPI×机器周期 = n(CPI=n)×m×时钟周期=nm/主频f, 注意指令周期单位是s或者ns,CPI无量纲
参考:https://en.wikipedia.org/wiki/Cycles_per_instruction
6,MIPS(MillionInstructions Per Second)
MIPS = 每秒执行百万条指令数 = 1/(CPI×时钟周期)= 主频/CPI
MFLOPS 每秒百万浮点运算次数。
表示秒钟所能执行的指令条数,对于微型计算机可用CPU的主频和每条指令的执行所需的时钟周期来衡量。
-
解析:为什么说数组查找快,增删慢。
2021-04-11 11:31:42首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除,数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是...首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除,数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是如何使数组的长度“发生变化”的呢,其实当要增删元素时,ArrayList会把数组进行扩容和缩容,从而达到使数组长度变化的效果,但是其实扩容缩容前的数组和扩容缩容后的数组不是同一个数组,扩容缩容后会重新创建了一个数组,然后再把这个新的数组重新赋值给ArrayList底层维护的旧数组,这其实是调用了一个常用的数组工具类Arrays里面的copyOf方法实现的。
那么,如果我们每次添加元素时,底层都只把数组的长度+1,然后把新的数据添加进去,调用Arrays工具类复制一个新数组,这样如果频繁增加的话,岂不是会在创建数组上消耗一部分时间?所以,数组每次扩容时,都会根据一定的算法计算出所需要的长度,多预留几个容量来减少数组在扩容上的时间。
至于为什么增删慢,你可以这样想,数组是一片连续的内存空间,如果你想在特定的位置添加一个元素,那后面的元素都要往后挪;想删除一个元素,后面的元素都要往前挪,这个过程就很耗时。
比如我们想删除下标为2的元素,下标从3开始(包含)的元素都得往前挪动。
在下标2和下标3中间添加一个元素,那下标3开始(包含)的元素都要往后挪动,挪动后原来的下标3就变成下标4了,后面以此类推
-
为什么 数组的查询快,链表的查询慢
2019-10-11 15:38:57但插入、删除慢,要望某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快。 链表就像手牵着手站成一圈的人,要找第10个人不容易,必须从第一个人一个个数过去。但插入、... -
京东金融一面——数组和链表区别...为什么链表查找慢?数组查找快?为什么连续内存就方便查找?(查找速度快)
2018-07-23 14:59:43面试官怒怼(也是我太紧张,没说清楚,这里总结,其实也要说到CPU的一些东西,平时没注意) 数组与链表的优缺点; 数组: ... 优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式... -
为什么不用数组表示一切?
2008-05-06 00:54:00为什么不用数组表示一切? 仅使用数组似乎就可以完成所有工作,为什么不用它们来进行所有的数据存储呢?我们已经见到了许多关于数组的缺点。在一个无序数组中可以很快进行插入(o(1)时间),但是查找却要花费较慢的o(N)... -
[数据结构]什么是数组?
2019-07-14 18:52:46数组的特点:查找快,修改慢, 查找的时间复杂度O(1),而修改是O(n) ,其中当不关心数组的顺序时,删除操作可以用末尾的元素覆盖所要删除位置的元素,然后再删除末尾元素此时复杂度为O(1) 手敲一个简单的数组 /** * @... -
数组模拟单链表
2020-03-09 17:23:05为什么使用数组来模拟链表 如果数据规模很大, 一个一个的new操作太慢了, 会超时, 使用数组会大大加快速度,数组模拟速度会比结构体那样快 实现一个单链表,链表初始为空,支持三种操作: (1) 向链表头插入一个数;... -
数组和链表的增删查改
2019-11-28 16:45:18数组为什么查询快,增删慢 查询 数组中的数据都是连续的在查询数组中的元素时候,只要进行遍历,或者跟据下标寻找。 增删 在数组中如果对某一个数据进行插入,那么后面的每一个数据都要进行右移。 如果进行删除那么... -
数组和链表区别?
2019-04-08 21:37:38数组和链表区别? 数组与链表的优缺点; 数组: 优点:使用方便 ,查询效率 比链表高,内存为一连续的区域 缺点:...为什么ArrayList查询效率高,删除效率慢? ArrayLIst查询效率高:ArrayLIst是连续存放元素的,... -
23、数据结构之数组和链表
2018-12-17 13:56:00数组数据结构 特点:查询和修改快增加和删除慢ArrayList和Vector的底层是使用数组的数据结构在ArrayList中初始化的长度是10,如果长度不够用了,每次会增加之前长度的50%,...为什么增加和删除慢?数组里面内存地... -
Day03_数组&&链表
2020-06-16 17:32:31接着昨天的数组继续: 数组的基本操作 链表 循环链表我们用的一般比较少,但是当处理的数据具有环形结构时,就特别适合用循环链表,比如约瑟夫问题。...那为什么在工程上,我们用的一般是双向链表而不是单链表 -
为什么ArrayList查询快 增删慢
2020-06-23 10:31:05ArrayList本质是数组的操作 增删慢: 1.每当插入或删除操作时 对应的需要向前或向后的移动...arr数组的地址假设为0x1000 arr[0] ~ arr[5] 地址可看作为 0x1000 + i * 4 首地址 + 下标 + 引用数据类型的字节大小 ... -
数据结构:栈、队列、数组、链表、红黑树结构的特点
2019-07-22 22:41:24* 为什么数组查询快? 因为数组的地址是连续的,我们可以通过数组的首地址查到数组,通过数组的索引可以快速查找到某一个元素 * 增删慢的原因:数组的长度是固定的,我们想要增加或者删除一个元素,必须创建一个新的... -
c++用size求数组大小_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?...
2020-12-25 12:58:35面试三连面试官:使用过集合吗?能说说都使用过哪些吗?小明:当然使用过,使用...小明:ArrayList是一个基于数组实现的集合,主要特点在于随机访问速度较快,但是插入删除速度较慢。面试官:那你知道为什么随机访问... -
Day14-15_数据结构之数组和链表(记忆)
2020-08-18 20:07:36为什么说效率低,因为你增加一个元素需要把后面的元素全部往后移动,如果很多个元素那全部移动完要多久?,所以才说效率低,删除同理,删除后全部元素都要往前移动,万一很对那也很麻烦 所以记住,数组“查询快增删... -
LinkedList为什么增删快、查询慢
2020-05-24 09:42:33ArrayList:长于随机访问元素,中间插入和移除元素比较慢,在插入时,必须创建空间并将它的所有引用向前移动,这会随着ArrayList的尺寸增加而产生高昂的代价,底层由数组支持。 LinkedList:通过代价较低的在List... -
arrays中copyof_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
2020-11-24 11:31:37面试三连面试官:使用过集合吗?能说说都使用过哪些吗?小明:当然使用过,使用...小明:ArrayList是一个基于数组实现的集合,主要特点在于随机访问速度较快,但是插入删除速度较慢。面试官:那你知道为什么随机访问... -
为什么使用二叉树?
2019-10-08 16:33:13一、为什么使用二叉树? 因为二叉树结合了有序数组,链表这两者的优点。在树中查找数据的速度和有序数组中查找一样快。并且插入数据和删除数据的速度和链表一样。 二、在有序数组中插入数据项太慢 有序数组:... -
【源码之下无秘密】ArrayList:在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
2020-04-05 16:00:21面试的时候经常被问到List访问速度快,添加、删除、修改速度慢,你知道为什么?如果不知道,这篇文章会让你看的明明白白,应付面试官绝对不是问题! -
为什么ArrayList的效率会比较低
2018-06-10 18:10:00因为ArrayList是使用数组实现的,若要从数组中删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,所以速度上就会比LinkedList要慢许多. 相反,LinkedList是使用... -
hashmap为什么是2的倍数_刨死你系列——HashMap剖析(基于jdk1.8)
2021-01-07 03:54:42本文的源码是基于JDK1.8版本,在学习HashMap之前,先了解数组和链表的知识...增删慢是因为,当在中间插入或删除元素时,会造成该元素后面所有元素地址的改变,所以增删慢(增删的时间复杂度为O(n) )。链表:链表具... -
HashMap为什么用红黑树
2020-08-15 00:06:48背景 在jdk8之前,hashmap底层由数组+双向链表 实现 在jdk8之后,如果链表长度超过8,...红黑树更通用,AVL树中查找通常更快,但这是以更多旋转操作导致更慢的插入和删除为代价的。因为AVL树可能需要O(log n)旋转,而 -
arraylist为什么查询快_Java面试系列(一)--集合类ArrayList
2020-11-22 08:48:22它的特点是:增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。2.ArrayList线... -
为什么java没有跳表_Java 算法 - 跳表:为什么 Redis 一定要用跳表来实现有序集合...
2021-03-15 14:29:59Java 算法 - 跳表:为什么 Redis 一定要用跳表来实现有序集合?在二分法查找一文中,我们知道二分法查找一种高效的数据查找方式,其时间复杂度是 O(logn)。但遗憾的是二分法查找只支持有序的静态数组。如果数据需要... -
array splice php w3c,深入一点 - 为什么说splice 效率低呢
2021-03-24 13:40:48尤其在例如 Vue或者React 框架中也不推荐使用,原因是为什么呢?splice 方法方法介绍如下:方法也比较明了,就是在数组内删除或者添加元素。如下示例:// 添加一个元素const arr = [1, 2, 3]arr.splice(1, 0, 2, 3)// ... -
C语言链表操作详解
2018-12-29 19:01:55为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组。使用数组存储数据的好处就是查询快,但是它的弊端也很明显: 使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要... -
二叉排序树的创建,遍历和删除
2019-09-21 19:18:31为什么会有它 数组 未排序:直接在队尾添加,速度快;查找速度慢。 排序:二分查找,查找速度快;添加新数据,需要找到插入位置移动后面的数组,速度慢 链表 添加快,查找慢; 简介 BST: (Binary Sort(Search) ...