LinkedList删除效率一定就比ArrayList快?不一定!!

ArrayList和LinkedList区别 文章目录前言一、ArrayList和LinkedList是什么?二、从源码分析ArrayList、LinkedList1.ArrayList的继承(extends)和实现(implement)2.ArrayList和LinkedList的基本属性和方法(get、add、remove)分析2.1 ArrayList 和 LinkedList 的 add 方法2.2 ArrayList 和 LinkedList 的 get 方法2.3ArrayList 和 LinkedList 的 remove 方法总结 .. 阅读详情

引入

先上代码:

public static void main(String[] args) {
		//创建ArrayList集合,泛型为String
		ArrayList<String> arrayList = new ArrayList<String>();
		//给集合添加数据
		for (int i = 0; i < 5000000; i++) {
			arrayList.add(i + "ArrayList");
		}
		//删除之前的时间戳
		long start = System.currentTimeMillis();
		//开始删除
		arrayList.remove(2500000);
		//删除之后的时间戳
		long end = System.currentTimeMillis();
		//输出删除所用的时间
		System.out.println("ArrayList删除的时间:" + (end - start));
		
		//创建LinkedList集合
		LinkedList<String> linkedList = new LinkedList<String>();
		//给集合添加数据
		for (int i = 0; i < 5000000; i++) {
			linkedList.add(i + "LinkedList");
		}
		//删除开始的时间戳
		start = System.currentTimeMillis();
		//删除
		linkedList.remove(2500000);
		//删除之后的时间戳
		end = System.currentTimeMillis();
		//输出删除所用时间
		System.out.println("LinkedList删除的时间:" + (end - start));

	}

输出的结果如下:

ArrayList删除的时间:3
LinkedList删除的时间:46

可见LinkedList按照索引删除好像是比ArrayList要慢很多,那是为何呢?

探究

我们一起来探究一下其中的原因!
先来看看ArrayList的remove()方法的源码:

public E remove(int index) {
	//检验索引是否合法
    Objects.checkIndex(index, size);
    //将装有数据的成员变量赋值给es这个局部变量
    final Object[] es = elementData;
    
	//直接根据传入的索引值定位到相应的元素
    @SuppressWarnings("unchecked") E oldValue = (E) es[index];
    //调用fastRemove()方法进行删除
    fastRemove(es, index);
	//将删除的值返回
    return oldValue;
}

private void fastRemove(Object[] es, int i) {
	//实际修改次数自增
   modCount++;
   //用于存放新的size的大小
   final int newSize;
   //新的size仍然大于要删除元素的索引
    if ((newSize = size - 1) > i)
    	//将索引i之后的元素前移一个位置
        System.arraycopy(es, i + 1, es, i, newSize - i);
    //将最后的一个位置置为空
    es[size = newSize] = null;
}

也就是说由于ArrayList存放元素的地址是连续的,所以它可以快速根据索引定位到相应的元素,时间复杂度为O(1),在删除元素的时候,也就是把索引以后的元素前移一个位置的时候是比较麻烦的,因为移动的元素可能会很多。

再来看下LinkedList的remove()方法的源码:

public E remove(int index) {
	//检验索引index的合法性
   checkElementIndex(index);
   //返回删除的元素
    return unlink(node(index));
}
//这个方法的作用主要是根据索引找到相应的元素
 Node<E> node(int index) {
	//如果索引在前半部分,从头开始向后找
    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
     //否则说明索引在后半部分,从后开始向前找
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}
//这个方法的作用主要是把找的元素从链表中删除,最后返回要删除的元素
E unlink(Node<E> x) {
 // assert x != null;
    final E element = x.item;
    final Node<E> next = x.next;
    final Node<E> prev = x.prev;

    if (prev == null) {
        first = next;
    } else {
        prev.next = next;
        x.prev = null;
    }

    if (next == null) {
        last = prev;
    } else {
        next.prev = prev;
        x.next = null;
    }

    x.item = null;
    size--;
    modCount++;
    return element;
}

可见,LinkedList根据索引删除还是比较复杂的,首先需要根据索引判断是在集合的前半部分还是在后半部分(有点像一次折半查找),然后在这“半个集合”里面去遍历,时间复杂度是O(n),找到相应的元素后,还需要把这个元素从链表中删除,只需要把指向待删除元素的指针后移和前移就可以了。

总结

  1. ArrayList根据索引的删除:
    定位元素快,O(1),但是去除相应元素较慢,需要移动元素位置进行复制
  2. LinkedList根据索引的删除:
    定位元素慢,O(n),但是去除相应的元素较快,只需要移动相应的指针, 不需要移动元素位置
  3. 结合以上的结论,可以看出两者根据索引删除元素的效率是差不多的,当索引取到一定的值时(例如本例取集合长度的中间值),可以看出ArrayList删除元素的效率反而比LinkedList要高。

(鉴于博主的能力和时间,以上所述可能存在不妥的地方,请读者不吝指教,可在评论区中提出,感谢!)

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路) 作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识... 阅读详情

相关推荐

Proxmox VE安装卡顿深度解析:显卡驱动与BIOS设置的黄金法则

本文深度解析Proxmox VE安装卡顿的根本原因,指出显卡驱动与BIOS设置是两大关键因素。文章详细阐述了如何通过添加`nomodeset`内核参数解决显卡兼容性问题,并提供了针对不同主板品牌的BIOS显卡优先级设置黄金法则。同时,还分享了从预处理到高级调试的完整实战排查流程,帮助用户从源头杜绝安装卡顿,确保PVE系统顺利部署。

weixin_29278805的博客 472

ArrayList和LinkedList的效率 详解

ArrayList和LinkedList的增删效率可以分为三种情况:在头部增删,在中间增删和在尾部增删; 当头部增删时: LinkedList的效率是要优于ArrayList的,因为ArrayList要进行大量的数据迁移; 在中间增删时: LinkedList的效率要低于Arraylist的,因为Linked在从头部头部或者尾部遍历找到对应的节点,而ArrayList迁移的数据就比较少了; 在尾部增删时: 1.当数据量较少时,两种的效率都很高,只需要在尾部添加元素即可; 2.当添加的元素有一定规模时,Lin

weixin_42754390的博客 1244

基于stm32f407VGT6控制WS2812的TIM1+PWM+DMA实现方式

项目中使用到了ws2812灯带,作为产品的外观显示灯,经过开发之后,整理一下,仅供大家参考。 WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。 其外型与一个5050 LED灯珠相同, 每个元件即为一个像素点。 像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路, 还包含有高精度的内部振荡器和可编程定电流控制部分, 有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素

weixin_43608153的博客 9214

LinkedList真的比ArrayList增删快吗?为什么?

首先,我们都知道,LinkedList数据结构是链表(也就是每个存储数据的空间会存储上个存储数据空间的地址值,该数据空间存储值和下个存储数据空间的地址值)且是双向链表; (略微潦草,将就着看) 而ArrayList的数据存储结构则是数组,而数组的缺点之一就是创建长度即是固定不可变的(类似于String,一旦赋值字符串在进行拼接就会重新字符串常量池创建新的字符串,原字符串还是存在的), 在看了源码的情况下得知,ArrayList的数组初始长度为10 ...

weixin_64442536的博客 3393

C++面向对象程序设计大作业:魔兽世界(三):开战

C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 … N ( N <= 20)。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五种。每种武士都有

RedRum_1965的博客 4036

用例设计:滴滴打车从轿车到完成支付如何测?

滴滴打车全流程测试用例设计从业务场景覆盖、功能逻辑分解、异常流验证三个维度展开,系统化地构建了测试方案。首先,业务流主干场景被分解为叫车、行程中、支付结算三个阶段,每个阶段都设计了核心测试用例,包括正向和异常用例,如定位准确性、车型选择逻辑、路径偏移监控、费用实时计算、多支付方式兼容等。专项测试补充了状态机验证、资损防控测试和性能测试,确保系统在不同情况下的稳定性和安全性。测试数据策略采用等价类划分设计,实战技巧包括流量回放技术、混沌工程注入和计费沙盒验证,以提高测试的覆盖率和准确性。最终输出交付物包括流程

海姐软件测试的博客 1524

Java学习笔记——LinkedList插入和删除真的比ArrayList快吗

Java学习笔记——LinkedList插入和删除速度真的比ArrayList快吗 问:LinkedList 和 ArrayList 有什么区别? 答: LinkedList 实现了 List 和 Deque 接口,一般称为双向链表; ArrayList 实现了List 接口,称为动态数组; LinkedList 在插入和删除数据时效率更高; ArrayList 在查找某个 index...

Au的博客 4484

EtherCat 从站开发中遇到的问题分享

EtherCat从站 AX58100

yu_arius的博客 2058

你不知道的LinkedList(二):LinkedList的增删操作真的会比ArrayList快吗

十年前,在刚解除java不久,面试中就有人问道LinkedList和ArrayList的区别。我记得当时普片的答案都说是,LinikedList底层基于链表实现。而ArrayList底层基于数据。因此LinkedList的查找操作比ArrayList慢,但是增删等操作由于不需要移动数据,因此会比ArrayList快。但是事实上果真如此吗?对此,我们对ArrayList和LinkedList的多种情景进行分析。 定义的全局变量如下: public static final int initSize = 100

dhaibo1986的专栏 1286

【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part1项目介绍与环境准备

看到这篇文章的你,相信对知识图谱相关概念不在陌生。知识图谱相关内容在实际开发中包含两个部分:1.知识图谱构建,2.知识图谱使用。知识图谱构建过程中涉及内容、技术都比较多。知识图谱的应用也逐渐在我们的生活中随处可见,其中基于知识图谱的问答系统就是其中的一个应用。基于知识图谱的问答系统称做KGQA(knowledge graph question answer),也有人称其为KBQA(knowledge based question answ).基于知识图谱的问答系统通常是使用的是领域知识图谱。下面就结合Git

让算法融入生活,改变生活! 4718

【WRF-Chem工具】pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

WW、forever的博客 210

LinkedList的插入速度不一定比ArrayList快

学习数据结构的时候,我们就已经得出了结论 对于数组,随机元素访问的时间复杂度是0(1), 元素插入操作是O(n); 对于链表,随机元素访问的时间复杂度是O(n), 元素插入操作是0(1). 元素插入对于链表来说应该是他的优势 但是他就一定比数组快? 我们执行插入1000w次的操作 privatestaticvoidtest(){ StopWatchstopWatch=newStopWatch(); intelementCount=100000;

m0_53914150的博客 552

基于Keil软件实现对射式红外传感器计次 (江协科技HAL库)

用HAL库复现江协科技,让嵌入式学习之路更顺畅。

2401_82728381的博客 798

Java--LinkedList真的比ArrayList添加元素快?Open JDK JMH带你揭开真相

【学习背景】 欢迎进来学习的小伙伴~ 不管你是学生,还是职场小白,还是入行1~3年的小伙伴,相信很多小伙伴在面试Java工作岗位时,发现LinkedList和ArrayList这个问题基本是必面的一道题, 【面试场景】 当面试官问到LinkedList和ArrayList的区别时,可能很多准备得不够充分的小伙伴第一反应的回答仅仅是这样的: LinkedList底层数据结构是链表,添加和删除元素效率比ArrayList高~ ArrayList底层数据结构是数组,查询效率比LinkedList高~ 面试官:哦

JustinQin 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java——LinkedList 和 ArrayList的全面对比讲解

你前后都有一个人,想插队的话,你只需要拉住你前面和后面的人,让他们也拉住你。:因为数据是通过链表存储的,要访问某个特定位置的元素,你需要从头(或尾)开始,逐个走过每个节点才能找到目标⚙️。因为你只需要拉住你前面和后面的人,告诉他们换一下顺序,所以插入和删除非常方便,效率高🏆。:由于每个节点除了存储数据外,还要存储指向前后节点的两个指针🧷,所以相比ArrayList,它占用的内存更多📊。:ArrayList就像是一个紧凑的货架,所有商品整齐排列,没有多余的“拉绳子”的动作,所以它更加节省空间💡。

weixin_44748929的博客 3837

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ArrayList和LinkedList的区别以及优缺点

ArrayList和LinkedList的区别以及优缺点 (在面试的时候经常会提问,谈一谈以你对ArrayList和LinkedList的区别以及优缺点,今天做一下笔记,方便以后查看,个人理解,不一定正确,若真有错误,请轻喷) 1、ArrayList: ArrayList实现了基于动态数组的数据结构,每个元素在内存中存储地址是连续的,根据下标查询的速度是很快的,向集合元素末尾添加的效率也是非常快...

MoLi的博客 2613

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ArrayList 和LinkedList的区别比较

‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析,他们一个是Array(动态数组)的数据结构,一个时Linked(链表)的数据结构,此外,他们两个都是对List接口的实现。前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列。

A_aspectJ的博客 4568

Java面试:ArrayList 和 LinkedList 的区别是什么?谈谈你对ArrayList和LinkedList的理解

ArrayList是基于动态数组实现的 List,其中元素的索引是基于顺序的。它提供了按索引访问元素的快速方式,适合需要频繁读取元素的场景。ArrayList 和 LinkedList 各有优缺点,选择合适的集合类将直接影响程序的性能和可维护性。了解它们的特性及适用场景可以帮助开发者更有效地管理数据结构,从而优化应用程序的性能。希望本篇博客能够帮助你更好地理解 ArrayList 和 LinkedList,并在未来的项目中作出明智的选择!

智通全网络工作室的博客 2601

LinkedList一定比ArrayList的插入和删除效率高吗

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

Visant Blog 3280

你确定 LinkedList 在新增/删除元素时,效率比 ArrayList 高?

每天早上七点三十,准时推送干货在面试的时候都会被问到集合相关的问题,比如:你能讲讲 ArrayList 和 LinkedList 的区别吗?那么我相信你肯定能够答上来:ArrayList...

Java极客技术 2276

JAVA中LinkedList和ArrayList的区别

1.底层数据结构ArrayList:基于动态数组,内存连续储存LinkedList:基于双向链表,节点包含前后指针​2.访问性能​ArrayList:随机访问O(1)(直接索引)LinkedList:随机访问O(n)(需遍历)3.​插入/删除性能​ArrayList:中间/头部操作O(n)(需移动元素)尾部操作O(1)(扩容时O(n))中间操作O(n)(遍历)+O(1)(修改指针)头尾操作O(1)4.​适用场景​优先ArrayList:高频随机访问/尾部操作/内存敏感场景。

imxiaoxin09的博客 1257

ArrayList与LinkedList的运行效率的对比

ArrayList与LinkedList的运行效率的对比 1.ArrayList ​ 1.1.ArrayList的特点: ​ a.ArrayList的底层结构是 动态数组,既然是数组,那么就拥有数组的特点。数组的最重要的特点就是它是连续存储的,有下标的。 ​ b.元素可以重复 ​ c.有序的。其中,有序是指存放进去的顺序是有序的。跟排序是两不相干的,排序是指对集合中的元素进行排序。 ​ d...

qq_41187393的博客 1703

LinkedList的增删一定比ArrayList快吗?

1.背景 众所周知,arrayList底层是通过数组实现,当其超过容量时,会进行1.5的扩容,将原数组数据迁移至新数组中。 而LinkedList底层为双向链表,其增加操作直接在尾部新增一个node节点即可。 那么,在插入相同的数据情况下(集合默认长度都是0),到底谁更快呢? 2.案例 public static void main(String[] args) {...

帝都的雁的博客 1241

Java--LinkedList真的比ArrayList添加元素快?Open JDK JMH带你揭开真相_为什么arraylist添加元素比linklist快

*由于添加元素消耗的内存比较大,idea执行基准测试过程中可能会出现内存泄露的报错:**java.lang.OutOfMemoryError: Java heap space。

2401_86454343的博客 1378

ArrayList与LinkedList的两者区别

我们在日常开发中经常会使用到AL 与 LL。 arraylist和linkedlist的区别是:数据结构不同,效率不同,自由性不同,主要控件开销不同。 两者对比: 1、数据结构不同 ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)双向链表的数据结构。 2、空间灵活性 ArrayList其实最好需要指定初始容量的(当然有些程序员为了偷懒,根本不会去初始化,这其实对于代码质量低的项目而言是无关紧要的)《1.其实在代码规范里,都要手动设置,只是我们用默认而已,如果公

m0_54850952的博客 8663

从源码分析为什么ArrayList查询快,LinkedList增删快,HashMap线程不安全

从源码分析为什么ArrayList查询快,LinkedList增删快,HashMap线程不安全1.ArrayList为什么查询快,增删慢呢?2.LinkedList的快速增删是如何实现的?3.HashMap和ConcurrentHashMap 1.ArrayList为什么查询快,增删慢呢? 一说到ArrayList和LinkedList,相信大家都知道查询的场景用ArrayList,需要经常增删的...

weixin_43776741的博客 1984
上一篇: ArrayList并发修改异常
下一篇: Java线程池深入浅出
BeyondCZN.
博客等级 码龄7年 59粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值