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架构师

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZZ308 物联网应用与服务赛题第F套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;F卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…

基于SSM的社区生鲜电商平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Unity Mirror学习(一) SyncVars特性使用

官网中所说的网络对象&#xff0c;指的是挂了 NetworkIdentity组件的对象 官网中所说的玩家对象&#xff0c;指的是NetworkManager脚本上的PlayerPrefab预制体 这个概念对阅读官网文档很重要&#xff0c;我刚开始并不理解&#xff0c;走了歪路 SyncVars&#xff08;同步变量&a…

ruoyi前后端分离版本开发框架解读---让你快速入门

后端结构 com.ruoyi ├── common // 工具类 │ └── annotation // 自定义注解 │ └── config // 全局配置 │ └── constant // 通用常量 │ └── core …

【Mysql】where 条件子句之逻辑运算符

逻辑运算符 and &&or ||not ! student表 一.查询分数在80 - 90之间 and写法 &&写法 区间&#xff08;between ....and......) 二.查询分数不为88 &#xff01;写法 not写法 三.查询分数大于88或者年龄小于22 满足其中一个条件即可 or写法 ||写法

Xilinx FPGA SPIx4 配置速度50M约束语句(Vivado开发环境)

qspi_50m.xdc文件&#xff1a; set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] set_property CONFIG_VOLTAGE 3.3 [curren…

华为交换机端口 access、trunk和hybrid收发数据规则

文章目录 1. 三个端口类型处理数据帧的汇总表2. access 端口3. trunk端口4. Hybrid 端口&#xff08;交换机的默认端口类型&#xff09;5.常用命令 1. 三个端口类型处理数据帧的汇总表 端口类型收到不带VLAN标签的帧的处理规则收到带VLAN标签的帧的处理规则发送帧时的处理规则…

数据采集代码示例

首先&#xff0c;你需要安装一个 Lua 的爬虫库&#xff0c;例如 Luanode 或者 Lush&#xff1a; lua local ltn12 require("ltn12") local http require("") local response http.request{ host "", port , path "/", …

HarmonyOS应用开发

引言 本章将深入探讨 HarmonyOS 应用开发的关键方面&#xff0c;包括应用的生命周期、数据存储和网络访问。了解这些内容对于创建功能丰富、高效的 HarmonyOS 应用至关重要。 目录 HarmonyOS 应用的生命周期HarmonyOS 应用的数据存储HarmonyOS 应用的网络访问总结 1. Harmo…

Java设计模式之迭代器模式

定义 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合角色&#xff1a;定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合角色&#xff1a;实现抽象聚合类&a…

休眠和睡眠有哪些区别?如何让电脑一键休眠?

电脑中有休眠和睡眠&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就通过本文来了解一下。 休眠和睡眠的区别 电脑在睡眠状态时&#xff0c;会切断内存之外的设备电源&#xff0c;电脑会进入睡眠状态&#xff0c;当再次唤醒电脑后&#xff0c;不会影响睡眠前保存好的工…

【kafka】Java客户端代码demo:自动异步提交、手动同步提交及提交颗粒度、动态负载均衡

一&#xff0c;代码及配置项介绍 kafka版本为3.6&#xff0c;部署在3台linux上。 maven依赖如下&#xff1a; <!-- kafka --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.6.0…