LinkedList的插入速度一定比ArrayList快吗?

在这里插入图片描述

目录

    • 一、有一道经典的面试题,“ArrayList 和 LinkedList 的区别是什么?”
      • 1、小白答法:
      • 2、入门答法:
      • 3、系统回答
    • 二、LinkedList的插入速度一定比ArrayList快吗?
    • 三、分析一下两种数据结构的add源码
      • 1、先分析熟悉的ArrayList
      • 2、LinkedList源码

大家好,我是哪吒。

一、有一道经典的面试题,“ArrayList 和 LinkedList 的区别是什么?”

1、小白答法:

  1. ArrayList是动态数组的数据结构实现,查找和遍历的效率较高;
  2. LinkedList 是双向链表的数据结构,增加和删除的效率较高;

2、入门答法:

ArrayList 底层是基于数组实现的,ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

LinkedList 底层是基于链表实现的,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。 正因为底层数据结构的不同,他们适用的场景不同,ArrayList 更适合随机查找,LinkedList 更适合删除和添加,查询、添加、删除的时间复杂度不同。

3、系统回答

ArrayList和LinkedList都是Java中实现了List接口的常用数据结构,它们的主要区别体现在以下四个方面:

  1. 底层数据结构:ArrayList基于动态数组实现,而LinkedList则是基于链表实现。
  2. 内存空间开销:ArrayList在List列表中预留了一定空间,而LinkedList则需要存储节点信息及指针信息。
  3. 随机访问效率:ArrayList可以通过索引直接访问元素,效率较高;而LinkedList则是线性的数据存储方式,只能从前往后移动指针依次查找,速度较慢。
  4. 增删操作效率:在进行元素的增加和删除操作时,由于ArrayList需要移动元素,效率较低;而LinkedList只需更改指针即可完成操作,效率较高。

综上所述,ArrayList和LinkedList各有优劣,需要根据实际需求来选择使用哪种数据结构。

核心观点,就是ArrayList适合查找和遍历,LinkedList 适合增加和删除,我总结的应该没错吧。

二、LinkedList的插入速度一定比ArrayList快吗?

做一个实验:

private static void test(int n){
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    List<String> arrayList = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        arrayList.add(UUID.randomUUID().toString());
    }
    stopWatch.stop();
    System.out.println("ArrayList添加"+n/10000+"万个字符串耗时:"+stopWatch.getTotalTimeSeconds());

    StopWatch stopWatch1 = new StopWatch();
    stopWatch1.start();
    List<String> linkedList = new LinkedList<>();
    for (int i = 0; i < n; i++) {
        linkedList.add(UUID.randomUUID().toString());
    }
    stopWatch1.stop();
    System.out.println("LinkedList添加"+n/10000+"万个字符串耗时:"+stopWatch1.getTotalTimeSeconds());
    System.out.println("-----------------------------");
}

在这里插入图片描述
随着add数量级的暴增,LinkedList的插入速度与ArrayList的插入速度在逐渐接近。

三、分析一下两种数据结构的add源码

1、先分析熟悉的ArrayList

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

2、LinkedList源码

LinkedList 是基于链表实现的结构,主要核心是 Node 节点。

add(E e) 是在链表的尾部添加数据。

public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
	// 记录原尾部节点 
    final Node<E> l = last;
    // 创建新节点,新节点的前置节点为原尾部节点
    final Node<E> newNode = new Node<>(l, e, null);
    // 更新尾部节点
    last = newNode;
    if (l == null)
    	// 尾部节点为空,更新头部节点
        first = newNode;
    else
    	// 尾部不为空,原尾部后置节点就是新节点
        l.next = newNode;
    size++;
    modCount++;
}

这是一个双链表的结构,有 prev 前置指针和next 后置指针。

还有首节点first、尾节点last、长度size:

transient int size = 0;

transient Node<E> first;

transient Node<E> last;

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

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

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

相关文章

07【保姆级】-GO语言的程序流程控制【if switch for while 】

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

【C++】复杂的多继承及其缺陷(菱形继承)

本篇要分享的内容是C中多继承的缺陷&#xff1a;菱形继承。 以下为本篇目录 目录 1.多继承的缺陷与解决方法 2.虚继承的底层原理 3.虚继承底层原理的设计原因 1.多继承的缺陷与解决方法 首先观察下面的图片判断它是否为多继承 这实际上是一个单继承&#xff0c;单继承的特…

clang插件对llvm源码插桩,分析函数调用日志(2)--google镜像

tick_plot__compile.ipynb clang插件对llvm源码插桩&#xff0c;分析函数调用日志(1) 分析 进出、链、出 df进出df[ df[tickKind].isin( [FuncEnter,FuncReturn] ) ]#代码中&#xff0c;只有在函数进入时&#xff0c;计算了链条长度 并写磁盘 df入df[ df[tickKind].isin…

18 CDN详解

1、理解CDN 1.CDN 和电商系统的分布式仓储系统一样&#xff0c;就近发货给客户(客户端)&#xff0c;所以&#xff0c;必然是提前在仓库中存储了某些商品. 2.CDN最擅长的是缓存静态数据&#xff0c;比如电商系统的热点静态页面&#xff0c;秒杀场景的页面等.问题&#xff1a;向…

tqdm学习

from tqdm import tqdmepochs 10 epoch_bar tqdm(range(epochs)) count 0 for _ in epoch_bar:count count1print("count {}".format(count))print(_)每次就是一个epoch

磁盘空间占用巨大的meta.db-wal文件缓存(tracker-miner-fs索引服务)彻底清除办法

磁盘命令参考本博客linux磁盘空间满了怎么办. 问题: 磁盘空间被盗 今天瞄了一下我的Ubuntu系统盘&#xff0c; nftdiggernftdigger-Ubuntu:~$ df -h 文件系统 容量 已用 可用 已用% 挂载点 udev 16G 0 16G 0% /dev tmpfs 3.2G 1.9…

【今日文章】:如何用css 实现星空效果

【今日文章】&#xff1a;如何用css 实现星空效果 需求实现tips: 需求 用CSS 实现星空效果的需求&#xff1a; 屏幕上有“星星”&#xff0c;且向上移动。移动的时候&#xff0c;动画效果要连贯&#xff0c;不能出现闪一下的样子。 实现 这里我们需要知道&#xff0c;“星星”是…

简单剖析程序的翻译过程!

本文旨在讲解一段源程序如何翻译成机器所能识别的二进制的命令的&#xff0c;希望通过本文&#xff0c;能使读者对一段程序的翻译过程有进一步的认识&#xff01; 这里首先要介绍的是一段程序从编写完成到执行需要经过以下几个步骤&#xff01; 1.预处理 首先讲到的是预处理&…

UI设计软件有哪些好用和免费的吗?

在我们分享五个有用的原型工具之前&#xff0c;完成原型&#xff0c;将优化界面&#xff0c;这次是UI设计师的任务&#xff0c;UI设计软件对设计师非常重要&#xff0c;UI设计工具是否使用直接影响最终结果&#xff0c;然后有人会问&#xff1a;UI界面设计使用什么软件&#xf…

IP-guard WebServer RCE漏洞复现

0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件&#xff0c;旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 漏洞成因 在Web应用程序的实现中&#xff0c;参数的处理和验证是确保应用安全的关键环节…

大数据毕业设计选题推荐-设备环境监测平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

基于工业智能网关的汽车充电桩安全监测方案

近年来&#xff0c;我国新能源汽车产业得到快速发展&#xff0c;电动车产量和销量都在持续增长&#xff0c;不仅国内市场竞争激烈&#xff0c;而且也远销海外&#xff0c;成为新的经济增长点。但与此同时&#xff0c;充电设施的运营却面临着安全和效率的双重挑战。 当前的充电桩…

node插件MongoDB(四)—— 库mongoose 的文档操作使用

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 前言 &#…

Python--列表及其应用场景

1.为什么需要列表 思考&#xff1a;有一个人的姓名(laowang)怎么书写存储程序&#xff1f; 用 变量。如&#xff1a;name laowang 但是&#xff0c;如果要记录很多人的名字&#xff0c;怎么办&#xff1f; 思考&#xff1a; 如果一个班级100位学生&#xff0c;每个人的…

Vue.js 学习总结(3)—— vite 打包图片时报错 Rollup failed to resolve import...

问题 图片依赖&#xff1a; Vite 打包前端项目时图片无法引入&#xff0c;报如下错误&#xff1a; ERROR [vite]: Rollup failed to resolve import "%7BlibeiDanmuKongmu%7D" from "D:/java/workspace/jeecgboot-vue3/src/views/funeral/tombInfo/area.vue?…

ros自定义消息包无法编译生成.h文件的问题解决

ros自定义消息包无法编译生成.h文件的问题解决 想要创建一个ROS功能包专门存放自己自定义的消息&#xff0c;想将这些消息都生成.h&#xff0c;可以由别的功能包来调用。 但是参照网上的诸多帖子未能解决&#xff0c;例如 https://blog.csdn.net/feidaji/article/details/10360…

yolov5 通过视频进行目标检测

打开yolov5-master文件夹&#xff0c;可以看到一个名为data的文件夹&#xff0c;在data中创建一个新的文件夹&#xff0c;命名为videos。 打开yolov5-master中的detect.py可以看到一行代码&#xff08;大概在245行左右&#xff09;为 parser.add_argument(--source, typestr,…

逐次变分模态分解(Sequential Variational Mode Decomposition,SVMD)(附代码)

代码原理 逐次变分模态分解&#xff08;Sequential Variational Mode Decomposition&#xff0c;SVMD&#xff09;是一种用于信号处理和数据分析的方法。它可以将复杂的信号分解为一系列模态函数&#xff0c;每个模态函数代表了信号中的一个特定频率成分。SVMD的主要目标是提取…

ZYNQ_project:key_breath

[Synth 8-327] inferring latch for variable led_breath_reg ["C:/Users/warrior/Desktop/ZYNQ/pl/key_breath/rtl/led_breath.v":66] 因为在组合逻辑中&#xff0c;用了非阻塞赋值的方式赋值信号。 组合逻辑自己给自己赋值会产生组合回环&#xff0c;输出不稳定。 …

Android 11.0 禁止弹出系统simlock的锁卡弹窗功能实现

1.前言 在11.0的系统rom产品定制化开发中,在关于定制sim卡定制机的一款产品中,需要实现simlock锁卡功能,在系统实现锁卡功能以后,在开机的过程中,或者是在插入sim卡 后,当系统检测到是禁用的sim卡后,就会弹出simlock锁卡弹窗,要求输入puk 解锁密码,功能需求禁用这个弹…