精华内容
下载资源
问答
  • 原因是为什么呢 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

    展开全文
  • 原因是为什么呢 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)—即每个对象都还存放这前驱的引用

    展开全文
  • 优点:使用方便 ,查询效率 比链表高,内存一连续的区域  缺点:大小固定,不适合动态存储,不方便动态添加  链表:  优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式存储。  ...

    数组与链表的优缺点;

    数组: 
    优点:使用方便 ,查询效率 比链表高,内存为一连续的区域 
    缺点:大小固定,不适合动态存储,不方便动态添加 
    链表: 
    优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式存储。 
    缺点:只能通过顺次指针访问,查询效率低

    链表和数组的本质差异

    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的主频和每条指令的执行所需的时钟周期来衡量。

    展开全文
  • 首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是...

    首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除,数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是如何使数组的长度“发生变化”的呢,其实当要增删元素时,ArrayList会把数组进行扩容和缩容,从而达到使数组长度变化的效果,但是其实扩容缩容前的数组和扩容缩容后的数组不是同一个数组,扩容缩容后会重新创建了一个数组,然后再把这个新的数组重新赋值给ArrayList底层维护的旧数组,这其实是调用了一个常用的数组工具类Arrays里面的copyOf方法实现的。

    那么,如果我们每次添加元素时,底层都只把数组的长度+1,然后把新的数据添加进去,调用Arrays工具类复制一个新数组,这样如果频繁增加的话,岂不是会在创建数组上消耗一部分时间?所以,数组每次扩容时,都会根据一定的算法计算出所需要的长度,多预留几个容量来减少数组在扩容上的时间。

    至于为什么增删慢,你可以这样想,数组是一片连续的内存空间,如果你想在特定的位置添加一个元素,那后面的元素都要往后挪;想删除一个元素,后面的元素都要往前挪,这个过程就很耗时。

     

    比如我们想删除下标为2的元素,下标从3开始(包含)的元素都得往前挪动。

    在下标2和下标3中间添加一个元素,那下标3开始(包含)的元素都要往后挪动,挪动后原来的下标3就变成下标4了,后面以此类推

    展开全文
  • 但插入、删除慢,要望某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快。 链表就像手牵着手站成一圈的人,要找第10个人不容易,必须从第一个人一个个数过去。但插入、...
  • 面试官怒怼(也是我太紧张,没说清楚,这里总结,其实也要说到CPU的一些东西,平时没注意) 数组与链表的优缺点; 数组: ... 优点:可动态添加删除 大小可变 ,内存可能是不连续内存,链式...
  • 为什么不用数组表示一切? 仅使用数组似乎就可以完成所有工作,为什么不用它们来进行所有的数据存储呢?我们已经见到了许多关于数组的缺点。在一个无序数组中可以很快进行插入(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-04-08 21:37:38
    数组和链表区别? 数组与链表的优缺点; 数组: 优点:使用方便 ,查询效率 比链表高,内存为一连续的区域 缺点:...为什么ArrayList查询效率高,删除效率? ArrayLIst查询效率高:ArrayLIst是连续存放元素的,...
  • 数组数据结构 特点:查询和修改快增加和删除慢ArrayList和Vector的底层是使用数组的数据结构在ArrayList中初始化的长度是10,如果长度不够用了,每次会增加之前长度的50%,...为什么增加和删除慢数组里面内存地...
  • Day03_数组&&链表

    2020-06-16 17:32:31
    接着昨天的数组继续: 数组的基本操作 链表 循环链表我们用的一般比较少,但是当处理的数据具有环形结构时,就特别适合用循环链表,比如约瑟夫问题。...那为什么在工程上,我们用的一般是双向链表而不是单链表
  • 为什么ArrayList查询快 增删

    千次阅读 2020-06-23 10:31:05
    ArrayList本质是数组的操作 增删: 1.每当插入或删除操作时 对应的需要向前或向后的移动...arr数组的地址假设0x1000 arr[0] ~ arr[5] 地址可看作为 0x1000 + i * 4 首地址 + 下标 + 引用数据类型的字节大小 ...
  • * 为什么数组查询快? 因为数组的地址是连续的,我们可以通过数组的首地址查到数组,通过数组的索引可以快速查找到某一个元素 * 增删的原因:数组的长度是固定的,我们想要增加或者删除一个元素,必须创建一个新的...
  • 面试三连面试官:使用过集合吗?能说说都使用过哪些吗?小明:当然使用过,使用...小明:ArrayList是一个基于数组实现的集合,主要特点在于随机访问速度较快,但是插入删除速度较。面试官:那你知道为什么随机访问...
  • 为什么说效率低,因为你增加一个元素需要把后面的元素全部往后移动,如果很多个元素那全部移动完要多久?,所以才说效率低,删除同理,删除后全部元素都要往前移动,万一很对那也很麻烦 所以记住,数组“查询快增删...
  • LinkedList为什么增删快、查询

    千次阅读 2020-05-24 09:42:33
    ArrayList:长于随机访问元素,中间插入和移除元素比较,在插入时,必须创建空间并将它的所有引用向前移动,这会随着ArrayList的尺寸增加而产生高昂的代价,底层由数组支持。 LinkedList:通过代价较低的在List...
  • 面试三连面试官:使用过集合吗?能说说都使用过哪些吗?小明:当然使用过,使用...小明:ArrayList是一个基于数组实现的集合,主要特点在于随机访问速度较快,但是插入删除速度较。面试官:那你知道为什么随机访问...
  • 为什么使用二叉树?

    2019-10-08 16:33:13
    一、为什么使用二叉树?  因为二叉树结合了有序数组,链表这两者的优点。在树中查找数据的速度和有序数组中查找一样快。并且插入数据和删除数据的速度和链表一样。 二、在有序数组中插入数据项太  有序数组:...
  • 面试的时候经常被问到List访问速度快,添加、删除、修改速度,你知道为什么?如果不知道,这篇文章会让你看的明明白白,应付面试官绝对不是问题!
  • 因为ArrayList是使用数组实现的,若要从数组删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,所以速度上就会比LinkedList要许多. 相反,LinkedList是使用...
  • 本文的源码是基于JDK1.8版本,在学习HashMap之前,先了解数组和链表的知识...增删是因为,当在中间插入或删除元素时,会造成该元素后面所有元素地址的改变,所以增删(增删的时间复杂度O(n) )。链表:链表具...
  • HashMap为什么用红黑树

    2020-08-15 00:06:48
    背景 在jdk8之前,hashmap底层由数组+双向链表 实现 在jdk8之后,如果链表长度超过8,...红黑树更通用,AVL树中查找通常更快,但这是以更多旋转操作导致更的插入和删除为代价的。因为AVL树可能需要O(log n)旋转,而
  • 它的特点是:增删:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。2.ArrayList线...
  • Java 算法 - 跳表:为什么 Redis 一定要用跳表来实现有序集合?在二分法查找一文中,我们知道二分法查找一种高效的数据查找方式,其时间复杂度是 O(logn)。但遗憾的是二分法查找只支持有序的静态数组。如果数据需要...
  • 尤其在例如 Vue或者React 框架中也不推荐使用,原因是为什么呢?splice 方法方法介绍如下:方法也比较明了,就是在数组删除或者添加元素。如下示例:// 添加一个元素const arr = [1, 2, 3]arr.splice(1, 0, 2, 3)// ...
  • C语言链表操作详解

    万次阅读 多人点赞 2018-12-29 19:01:55
    为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组。使用数组存储数据的好处就是查询快,但是它的弊端也很明显: 使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要...
  • 为什么会有它 数组 未排序:直接在队尾添加,速度快;查找速度。 排序:二分查找,查找速度快;添加新数据,需要找到插入位置移动后面的数组,速度 链表 添加快,查找; 简介 BST: (Binary Sort(Search) ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 147
精华内容 58
关键字:

数组为什么删除慢