首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在LinkedList末尾添加一个元素比添加一个ArrayList要花更长的时间?

在LinkedList末尾添加一个元素比添加一个ArrayList要花更长的时间的原因是LinkedList的内部实现方式不同于ArrayList。

LinkedList是一种链表数据结构,它由一系列节点组成,每个节点包含一个元素和一个指向下一个节点的引用。当在LinkedList末尾添加一个元素时,需要先找到链表的最后一个节点,然后创建一个新的节点并将其链接到最后一个节点的后面。这个过程需要遍历整个链表,直到找到最后一个节点。因此,添加一个元素的时间复杂度是O(n),其中n是链表的长度。

相比之下,ArrayList是一种基于数组的数据结构,它在内存中分配一块连续的空间来存储元素。当在ArrayList末尾添加一个元素时,只需要将元素直接放入数组的最后一个位置即可,不需要遍历整个数组。因此,添加一个元素的时间复杂度是O(1)。但是,如果数组已经满了,需要进行扩容操作,这个过程会涉及到数据的复制,因此在某些情况下,添加一个元素的时间复杂度可能会达到O(n)。

综上所述,LinkedList在末尾添加一个元素需要遍历整个链表,而ArrayList只需要将元素放入数组的最后一个位置。因此,LinkedList的添加操作相对较慢。但是LinkedList在其他操作上可能更加高效,比如在链表的任意位置插入或删除元素,因为它只需要修改节点的引用,而不需要像ArrayList那样进行数据的搬移。所以,在选择使用LinkedList还是ArrayList时,需要根据具体的场景和需求来进行权衡和选择。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据结构思维 第五章 双链表

例如,当我们使用add方法将元素添加ArrayList末尾,我们发现,执行n次添加时间正比于n。也就是说,估计斜率接近1。...根据我们分析,我们预计每个add都要花时间,因为一个链表中,我们不必转移现有元素;我们可以头部添加一个新节点。所以我们预计n次添加时间是线性。...5.3 LinkedList尾部添加 开头添加元素是一种操作,我们期望LinkedList速度快于ArrayList。但是为了末尾添加元素,我们预计LinkedList会变慢。...图 5.2:分析结果:LinkedList末尾添加n个元素运行时间和问题规模 同样,测量值很嘈杂,线不完全是直,但估计斜率为1.19,接近于头部添加元素,而并不非常接近2,这是我们根据分析预期...LinkedList对象包含指向列表一个和最后一个元素链接。 所以我们可以从列表任意一端开始,并以任意方向遍历它。因此,我们可以常数时间内,列表头部和末尾添加和删除元素

27130

面试官:兄弟,说说 ArrayListLinkedList 有什么区别

1)ArrayList ArrayList 新增元素有两种情况,一种是直接将元素添加到数组末尾,一种是将元素插入到指定位置。...595 LinkedList从集合头部位置新增元素花费时间15 ArrayList 花费时间 LinkedList 要多很多。...69 LinkedList从集合尾部位置新增元素花费时间193 ArrayList 花费时间 LinkedList 要少一些。...ArrayList 添加元素时候如果不涉及到扩容,性能在两种情况下(中间位置新增元素、尾部新增元素 LinkedList 好很多,只有头部新增元素时候 LinkedList 差,因为数组复制原因...花费时间 LinkedList 少很多; 从集合尾部删除元素时,ArrayList 花费时间 LinkedList 少一点。

61931

说一下 ArrayListLinkedList 区别?

在上一篇文章里,我们聊到了基于动态数组 ArrayList 线性表,今天我们来讨论一个基于链表线性表 —— LinkedList。...,而链表需要 O(n) 时间复杂度查找元素添加和删除操作上: 如果是在数组末尾操作只需要 O(1) 时间复杂度,但在数组中间操作需要搬运元素,所以需要 O(n)时间复杂度,而链表删除操作本身只是修改引用指向...♀️ 疑问 2:为什么字段都声明 transient 关键字? 这个问题我们分析源码过程中回答。 疑问 ArrayList 少很多,LinkedList 真香(还是别高兴得太早吧)。...构造方法 LinkedList 有 2 个构造方法: 1、无参构造方法: no-op; 2、带集合构造: 链表末尾添加整个集合,内部调用了 addAll 方法将整个集合添加到数组末尾。...分析一下添加方法时间复杂度,区分在链表两端或中间添加元素情况共: 如果是链表首尾两端添加: 只需要 O(1) 时间复杂度; 如果在链表中间添加: 由于需要定位到添加位置前驱和后继节点,所以需要

33420

ArrayList VS LinkedList,最后一战

1)ArrayList ArrayList 新增元素有两种情况,一种是直接将元素添加到数组末尾,一种是将元素插入到指定位置。...595 LinkedList从集合头部位置新增元素花费时间15 ArrayList 花费时间 LinkedList 要多很多。...69 LinkedList从集合尾部位置新增元素花费时间193 ArrayList 花费时间 LinkedList 要少一些。...ArrayList 添加元素时候如果不涉及到扩容,性能在两种情况下(中间位置新增元素、尾部新增元素 LinkedList 好很多,只有头部新增元素时候 LinkedList 差,因为数组复制原因...花费时间 LinkedList 少很多; 从集合尾部删除元素时,ArrayList 花费时间 LinkedList 少一点。

30930

Collection子接口之List

比如:执行add(E e)方法时候, ArrayList 会默认将指定元素追加到此列表末尾,这种情况时间复杂度就是 O(1)。...内存空间占用: ArrayList 空 间浪费主要体现在在 list 列表结尾会预留一定容量空间,而 LinkedList 空间花费则体现在它一个元素都需要消耗 ArrayList 更多空间...为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。...ArrayList 扩容机制 先来看 add 方法 /** * 将指定元素追加到此列表末尾。...当 add 第 2 个元素时,minCapacity 为 2,此时 e lementData.length(容量)添加一个元素后扩容成 10 了。

56410

ArrayList和LinkendList不是我们想那样?

这两种方法也是有很大不同添加元素到任意位置,会导致数组中该位置之后所有元素都需要重新排列,将元素添加到数组末尾。而直接在末尾新增元素,如果不扩容时候是没有元素复制排序过程。...,默认是将元素添加到链表末尾,首先将last元素置换到临时变量中,生成一个Node节点对象,然后将last引用指向新节点对象,之前last对象前指针执行新节点对象。...也是支持将元素添加到任意位置,将元素添加到任意两个元素中间,只会改变前后元素前后指针,指针将会指向添加元素,所以ArrayList添加操作性能优势明显。...从中间添加元素时候,我们知道ArrayList需要对部分数据进行复制重排,效率不是很高,但是LinkedList元素添加到中间位置是添加元素效率最低,我们知道靠近中间位置添加元素之前循环查找是遍历元素最多操作...从尾部添加元素操作测试中,我们发现如果不需要扩容情况下,ArrayList效率LinkedList效率高,这是因为ArrayList从尾部添加元素时候不需要重排数据,效率非常高,而LinkedList

57920

Collection 子接口之 List

比如:执行add(E e)方法时候, ArrayList 会默认将指定元素追加到此列表末尾,这种情况时间复杂度就是 O(1)。...内存空间占用:ArrayList 空 间浪费主要体现在在 list 列表结尾会预留一定容量空间,而 LinkedList 空间花费则体现在它一个元素都需要消耗 ArrayList 更多空间...为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。...ArrayList 扩容机制 先来看 add 方法 /** * 将指定元素追加到此列表末尾。...当 add 第 2 个元素时,minCapacity 为 2,此时 e lementData.length(容量)添加一个元素后扩容成 10 了。

46630

Java集合解惑

解析: 当在 ArrayList 中增加一个对象时 Java 会去检查 Arraylist 以确保已存在数组中有足够容量来存储这个新对象,如果没有足够容量就新建一个长度更长数组(原来1.5倍),...从动态扩容角度看由于 ArrayList 和 Vector(Stack 继承自 Vector,只 Vector 基础上添加了几个 Stack 相关方法,故之后不再对 Stack 做特别的说明)使用数组实现...,抛开两个只序列化过程中使用方法不说,没有一个 ArrayList 方法是同步,相反,绝大多数 Vector(Stack)方法法都是直接或者间接同步,因此就造成 ArrayList Vector...(Stack)更快些,不过最新 JVM 中,这两个类速度差别是很小,几乎可以忽略不计;而 LinkedList 是双向链表实现,根据索引访问元素时需要遍历寻找,性能略差。...LinkedHashMap 支持插入顺序或者访问顺序,LRU 算法其实就要用到它访问顺序特性,即对一个键执行 get、put 操作后其对应键值对会移到链表末尾,所以最末尾是最近访问,最开始最久没被访问

65220

笔记29 | 整理Java容器类

默认队列末尾添加元素;如果指定了索引位置,则在指定位置末尾添加元素 get : 获取指定位置元素 indexOf : 获取指定元素一个索引位置 lastIndexOf : 获取指定元素最后一个索引位置...链表常用方法包括上面队列列出几个,下面列出添加方法 addFirst/addLast : 添加到开头/添加末尾 getFirst/getLast : 获取首元素/获取末元素 removeFirst...具体说,当一个向量指针Iterator正在使用时,另一个线程改变了向量状态(比如添加或删除了一些元素),这时调用指针方法将抛出异常(ConcurrentModificationException...堆栈常用方法向量多了三个,分别是 peek(获取首元素)、 pop(出栈)、 push(入栈), 看起来Stack类似一个堆栈方式链表。...因为同步需要花费机器时间,所以HashTable执行效率要低于HashMap,向量和队列情况与之类似。 哈希表常用方法与映射是一样,就不一一列举了。

57140

Java高频面试之集合篇

从集合头部位置新增元素花费时间" + (timeEnd - timeStart)); } ArrayList从集合头部位置新增元素花费时间415 LinkedList从集合头部位置新增元素花费时间...从集合中间位置新增元素花费时间" + (timeEnd - timeStart)); } ArrayList从集合中间位置新增元素花费时间19 LinkedList从集合中间位置新增元素花费时间28610...从集合尾部位置新增元素花费时间" + (timeEnd - timeStart)); } ArrayList从集合尾部位置新增元素花费时间17 LinkedList从集合尾部位置新增元素花费时间13...> elementData.length 通过索引将元素添加末尾 elementData[size++] = e list.add(int index, Object e) 性能比较差 检查插入位置是否合理范围之内...[index] = e LinkedList 添加元素流程 list.add(Object e) 直接将元素添加到队尾 list.add(int index, Object e) 检查插入位置是否合理范围之内

6010

【面试题精讲】ArrayList 插入和删除元素时间复杂度

为什么需要 ArrayList开发过程中,我们经常需要处理一组数据,并且可能需要频繁地进行插入、删除操作。...ArrayList 插入和删除元素时间复杂度 ArrayList 末尾插入元素:O(1) ArrayList 中间或开头插入元素:O(n)...删除指定位置元素:O(n) 3.1 ArrayList 末尾插入元素 当我们向 ArrayList 末尾插入元素时,只需将新元素添加到内部数组最后一个位置即可,不需要移动其他元素...ArrayList 插入和删除元素优点 ArrayList 末尾插入元素时间复杂度为 O(1),效率高。...末尾插入元素时间复杂度为 O(1),而在中间或开头插入元素、删除指定位置元素时间复杂度为 O(n)。如果需要频繁地进行这些操作,可以考虑使用 LinkedList 替代 ArrayList

48530

Java 容器 & 泛型:二、ArrayListLinkedList和Vector比较

三、LinkedListArrayList 性能 LinkedListArrayList 一样实现 List 接口,LinkedList 是 List 接口链表实现。...基于链表实现方式使得 LinkedList 插入和删除时更优于 ArrayList,而随机访问则 ArrayList 逊色些。...LinkedListArrayList 方法时间复杂度总结如下图所示。 表中,add() 指添加元素方法,remove() 是指除去(int index)角标。...ArrayList 具有 O(N)任意指数时间复杂度添加/删除,但 O(1) 操作列表末尾。链表 O(n) 任意指数时间复杂度添加/删除,但 O(1) 操作端/列表开始。...从复杂度和测试结果,我们应该懂得平时添加或者删除操作频繁地方,选择LinkedList时考虑: 1、没有大量元素随机访问 2、添加/删除操作 下面用 LinkedList 实现一个数据结构–栈。

24930

【Java提高十六】集合List接口详解

add 操作以分摊固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。 ArrayList擅长于随机访问。...每次添加元素时,ArrayList都会检查是否需要进行扩容操作,扩容操作带来数据向新数组重新拷贝,所以如果我们知道具体业务数据量,构造ArrayList时可以给ArrayList指定一个初始容量...基于链表实现方式使得LinkedList插入和删除时更优于ArrayList,而随机访问则ArrayList逊色些。...2.1增加:add(E e) add(E e):将指定元素添加到此向量末尾。 ?...所以linkedList插入动作ArrayList动作快就在于两个方面。 1:linkedList不需要执行元素拷贝动作,没有牵一发而动全身大动作。

1.1K31

Java集合之LinkedList源码分析

概述 LinkedLIstArrayLIst一样, 都实现了List接口, 但其内部数据结构不同, LinkedList是基于链表实现(从名字也能看出来), 随机访问效率要比ArrayList差....它插入和删除操作ArrayList更加高效, 但还是要遍历部分链表指针才能移动到下标所指位置, 只有链表两头操作能省掉移动, 如add(), addFirest(), removeLast(...LinkedList源码分析 1.数据结构 LinkedList是基于链表结构实现, 类中定义了头尾指针. 其内部维护了一个双向链表 ? ? 2.构造方法 默认构造函数很简单, 啥也没有 ?...将集合元素添加LinkedList中: ? ? ? 3.存储 (1)add(E)链表末尾添加元素 ? ? (2)add(int, E)指定位置插入元素 ? ? ?...(3)addAll(Collection)将集合添加到链表末尾, 该方法构造方法中介绍了, 在此不再赘述 ?

35540

Java集合经典26问!

ArrayList 了解吗? ArrayList 底层是动态数组,它容量能动态增长。添加大量元素前,应用可以使用ensureCapacity操作增加 ArrayList 实例容量。...(size + 1); //将e添加到数组末尾 elementData[size++] = e; return true; } // 每次新增一个元素时,需要判断这个...因为ArrayList直接通过数组下标直接找到元素LinkedList要移动指针遍历每个元素直到找到为止。 新增和删除元素LinkedList速度要优于ArrayList。...因为ArrayList新增和删除元素时,可能扩容和复制数组;LinkedList实例化对象需要时间外,只需要修改指针即可。...当我们往容器添加元素时,不直接往容器添加,而是先将当前容器进行复制,复制出一个容器,然后往新容器添加元素添加元素之后,再将原容器引用指向新容器。

38610

java面试强基(17)

比如:执行add(E e)方法时候, ArrayList 会默认将指定元素追加到此列表末尾,这种情况时间复杂度就是 O(1)。...内存空间占用: ArrayList 空 间浪费主要体现在在 list 列表结尾会预留一定容量空间,而 LinkedList 空间花费则体现在它一个元素都需要消耗 ArrayList 更多空间...我们项目中一般是不会使用到 LinkedList ,需要用到 LinkedList 场景几乎都可以使用 ArrayList 来代替,并且,性能通常会更好!...聊一聊ArrayList扩容机制?  ​ 以无参数构造方法创建 ArrayList 时,实际上初始化赋值一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。...即向数组中添加一个元素时,数组容量扩为 10。 Arrlist扩容是原来数组长度1.5倍。

14440

Java高频面试题- 每日三连问?【Day3】 — 集合容器篇

常用实现类有 ArrayListLinkedList 和 Vector。 Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。...数据结构:ArrayList 是动态数组数据结构实现; 随机查询效率:(优势),ArrayList LinkedList 随机访问时候效率要高,因为 LinkedList 是线性数据存储方式...插入和删除效率:List中间插入和删除数据时,ArrayList 要比 LinkedList 效率低很多,因为 ArrayList 增删操作要影响数组内其他数据下标(整体移动),而如果是正常末尾追加方式...内存空间占用:LinkedList ArrayList 更占内存,因为 LinkedList 节点除了存储数据,还存储了两个引用,一个指向前一个元素一个指向后一个元素。 ?...Collections内部使用数组排序方法,所有它们两者都有相同性能,只是Collections需要花时间将列表转换为数组。 ?

57120

数据结构思维 第四章 `LinkedList`

上运行add所需时间,它向末尾添加元素。...如果你将这个序列传给plotResults,它会产生一个如图 4.1 所示图形。 图 4.1 分析结果:将n个元素添加ArrayList末尾运行时间与问题规模。 下一节解释了如何解释它。...4.4 解释结果 基于我们对ArrayList工作方式理解,我们期望,添加元素到最后时,add方法需要常数时间。所以添加n个元素时间应该是线性。...解释嘈杂测量值更好方法是,重对数刻度上绘制运行时间和问题规模。 为什么?我们假设运行时间与n ** k成正比,但是我们不知道指数k是什么。...基于我们对ArrayList工作方式理解,我们期望,每个添加操作是线性,所以n次添加时间应该是平方。如果是这样,重对数刻度中,直线估计斜率应该接近2。是吗?

29520

《我们一起学集合》-LinkedList

-4.png] 如图我们可以知道,末尾添加元素时先预存了last节点,然后构造新节点newNode并连接到当前尾节点,然后更新newNode节点为last节点,最后将节点连接完成。...[LinkedList-6.jpg] 下面是添加集合到链表方法,插入方式和上面基本相似。 // 将指定集合中所有元素追加到此列表末尾,按照指定集合迭代器返回它们顺序。...区别有: 结构不同:ArrayList是基于数组,LinkedList是基于节点Node 效率不同:ArrayList随机访问LinkedList效率高,因为LinkedList必须每次从头遍历查找...从理论上讲ArrayList删除一个元素效率是LinkedList低,应为ArrayList删除一个不是末尾元素会产生元素拷贝,而LinkedList删除一个元素只是修改前后节点引用。...此操作需要时间,并且当此类获取频繁发生时缓存中内存页面需要一直替换->缓存未命中->缓存效率不高。ArrayList元素存储连续内存中,这更利于缓存。这也正是现代CPU体系结构正在优化内容。

34800

【JDK1.8】JDK1.8集合源码阅读——LinkedList

一、前言 这次我们来看一下常见List中第二个——LinkedList,在前面分析ArrayList时候,我们提到,LinkedList是链表结构,其实它跟我们分析map时候讲到LinkedHashMap...extends E> c)作为public方法,所以要考虑到list已经存在元素情况下,链表末尾添加元素: public boolean addAll(Collection<?...if (index == size) { // index == size,说明要插入元素位置就在链表末尾,后置元素为null,前一个元素就是last succ = null;...3.3 LinkedList重要方法 3.3.1 add(E e) 先说一下具体思路,作为链表结构,那么添加元素就是链表末尾插入元素,这个过程中要考虑: 末尾元素为null,该如何处理 public...四、LinkedList使用场景 LinkedList作为链表结构特性,可以保证其端点操作:如插入以及删除等,速度ArrayList快,道理很简单,ArrayList删除后,每次都要把后面的元素往前移

779120
领券