arraylist和linkedlist到底有哪些区别?(代码片段)

执章学长 执章学长     2023-02-06     488

关键词:

ArrayList 和 LinkedList 到底有哪些区别?

ArrayList 和 LinkedList

ArrayList 和 LinkedList 之前有那些区别?这个是面试中最常见的一个问题之一了。跟着源码分析,看看两者之间的区别。

底层数据结构不同

进入 ArrayList 的源码,可以看到 ArrayList 的成员变量有一个 Object 数组,这个数据就是用来存放插入的数据。

同样进入 LinkedList 的源码,可以看到成员变量维护者两个节点,一个是 first 节点,一个是 last 节点,实际上,LinkedList 底层是一个双向链表。

操作集合的底层实现不同

插入操作

很容易理解,底层的数据结构不同,直接影响了操作集合的底层操作就是不同的,这里可能需要你对数据结构有一定的了解。

首先是插入,根据我们学过的数据结构的知识,我们知道数组中的元素是存储在一个连续的空间中的,而链表则不是。因此根据索引查找的情况,数组只需要根据偏移量就可以立马查找到数据,这里我们结合源码看。

以下是 ArrayList 的 add 方法

首先当然是需要判断插入时 index 索引是否合法,插入的索引只能是[0,size],这也很容易能够理解,否则就容易造成数组越界。

接着调用 System 的 arraycopy 方法,这个方法是一个 navite 方法,说明这个方法不是由 Java 实现的,实现的效果是将数组A的复制到数组B,并且指定区间,这里是将要插入的 index 之后的数据(包括index指向的数据),全都往后移动一位。
例如:数组[1,2,3,4],index = 2,操作后就会变为[1,2,3,3,4]。


接着就是将元素插入到 index 的位置,然后 size++。

以下是 LinkedList 的 add方法


首先,是先判断插入的位置是否是尾端,如果是尾端,直接插入即可,因为是双链表,我们自然维护着最后一个节点的引用。

如果是遇到插入到中间的情况,也就是最普遍的情况,则是先要获取到插入的节点的引用,然后再插入。而获取到插入节点的引用也非常有意思,因为我们知道,我们既拥有头指针,也拥有尾指针,因此我们只要判断插入的索引是靠近哪一个,然后再从这个端点开始遍历。这里size>>1的效果等同于size/2

删除操作

对于 ArrayList 的删除,首先是找到目标元素,然后再将后面的元素全部往前移动。

对于 LinkedList 的删除,首先同样是遍历到要删除的节点,然后直接调用unlink 方法将该节点断开即可。

通过 unlink 方法断开掉要删除的节点。

按照索引查找

对于 ArrayList 来说,无非只需要检查一下参数是否合法,然后返回数组的对应元素即可。

而对于 LinkedList 来说,除了判断参数是否合法外,需要先找到该索引的节点(通过遍历),然后才能返回对应这个节点的值。


总结:其实对于 ArrayList 和 LinkedList 的最大差异,就是底层数据结构的不同,导致在执行同个操作的时候时间效率不一样,比如如果需要频繁按照索引查找元素,则适合使用 ArrayList ;如果是需要频繁删除或者添加元素,则适合使用 LinkedList ,因为 ArrayList 需要移动大量元素,当然 LinkedList 在删除元素前还需要一次遍历进行定位,因此这也不止绝对的。而对于存储空间的选择,实际上 ArrayList 的空间开销主要是在数组上,当然由于扩容机制,会导致数组会有一定的预留空间;而对于 LinkedList 的空间开销主要是在前驱节点和后继节点上,因此每个元素的空间消耗要比 ArrayList 更多。

关于线程安全

ArrayList 和 LinkedList 都是不保证线程安全的。在进行各种操作时并没有上锁,迭代器获取下一个元素的时候会检查是否被修改,如果被修改则抛出ConcurrentModificationException异常。


老徐和阿珍的故事:arraylist和linkedlist的效率到底哪个高?(代码片段)

...今还单身。老徐问道:“阿珍,你知道ArrayList和LinkedList的区别吗?”阿珍微微一笑,说:“这也太小儿科了,ArrayList是基于数组实现,LinkedList是基于链表实现。”老徐竖起了大拇指,说:“不... 查看详情

arraylist和linkedlist有什么区别?

---恢复内容开始---ArrayList和LinkedList都实现了List接口,但是:  ArrayList是基于索引的数据接口,底层是数组,能够以O(1)时间复杂度随机访问元素。而LinkedList是以元素列表存储的数据,每一个元素都和它的前一个元素和后一... 查看详情

arraylist和linkedlist

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:  1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所... 查看详情

arraylist和linkedlist区别,举例说明下

一般大家都知道ArrayList和LinkedList的大致区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remov... 查看详情

arraylist和linkedlist剖析

...不能重复;List接口表现为有序,可重复。其中ArrayList和LinkedList是List接口的实现类中最常用的两个。下面针对ArrayList和LinkedList这两个实现类做一些说明:(1)ArrayList:ArrayList是 查看详情

arraylist和linkedlist的区别

...基本区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList... 查看详情

linkedlist和list的区别

参考技术A一般大家都知道ArrayList和LinkedList的大致区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操... 查看详情

arraylist与linkedlist常见的问题(代码片段)

...些,它们分别有什么区别?答:常见的有ArrayList,Vector,LinkedList等。ArrayList底层是数组组成,Vector是线程安全的ArrayList类。LinkedList底层是由链表组成。ArrayList与Vector的区别,扩容上面ArrayList是扩容1.5倍,而Vector是扩容两倍。Vect... 查看详情

java学习笔记--类arraylist和linkedlist的实现

...ist中有两个实现使用的很频繁,一个是ArrayList,另一个是LinkedList,在学习中肯定都会有这样的疑问:什么时候适合使用ArrayList,什么时候用LinkedList?这时,我们就需要了解ArrayList和LinkedList的底层的实现,下面,为了更好的了解它们... 查看详情

arraylist和linkedlist重大区别?

网上是这样说的,arraylist比linkedlist添加和删除慢,原因是arraylist添加需要更新下标,删除需要移动位置。而linkedlist添加快,删除快,原因是链表接上就行了。那么问题来了?数组也是有序的,如果不指定下标,直接添加到尾部... 查看详情

arraylist和linkedlist的区别

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下: 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所... 查看详情

arraylist、linkedlist、hashmap这三个分别的用法?比如实现网站上的哪些功能的时候该选用哪一个?

一般我们用ArrayList就可以了,LinkedList是双向链表,很少用。ArrayList是List集合,里面放的是单一的任意不为空的对象,HashMap是一个哈希表,是key-value键值对。着两者的用途是不一样的。使用的场景有很多很多,这里举两个例子:... 查看详情

arraylist和linkedlist区别(代码片段)

简述:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于双链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayL... 查看详情

arraylist和linkedlist的区别

1、ArrayList基于数组,LinkedList基于链表2、ArrayList的get操作优于LinkedList的get,因为LinkedList要移动指针3、add和remove,LinkedList占优势,因为LinkedList只需要接链和断链,而ArrayList需要整体移动数据。 查看详情

java集合详解(代码片段)

...分类ConllectionList如何使用list接口List方法List接口的实现1.LinkedList(一)LinkedList的底层是什么?(二)LinkedList能不能作为队列使用?(三)LinkedList能不能作为栈使用?(四)LinkedList作为双端队列使用总结2.ArrayList(一)ArrayList的底... 查看详情

arraylist和linkedlist的区别

一般大家都知道ArrayList和LinkedList的大致区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remov... 查看详情

arraylist和linkedlist的区别

arraylist和linkedlist的区别:一、查找元素方法不同:1、arraylist可以直接通过数组下标找到元素。2、linkedlist要通过移动指针遍历每个元素,直到找到需要的元素为止。arraylist查找元素的速度比linkedlist快。二、空间消耗。1、arraylist... 查看详情

arraylist和linkedlist区别

一般大家都知道ArrayList和LinkedList的大致区别:     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedLi... 查看详情