首页 > 试题广场 >

ArrayList和LinkedList有什么区别?

[问答题]

1) 因为 Array 是基于索引 (index) 的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array 获取数据的时间复杂度是 O(1), 但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

2) 相对于 ArrayList LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) ArrayList 在插入数据时还需要更新索引(除了插入数组的尾部)。

3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList

4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node<E> first Node<E> last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,Node next,Node pre)

什么场景下更适宜使用 LinkedList,而不用ArrayList

1) 你的应用不会随机访问数据 。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。

2) 你的应用更多的插入和删除元素,更少的读取数据 。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。

以上就是关于 ArrayListLinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayListArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小

发表于 2017-01-18 09:23:13 回复(2)
zll头像 zll
ArrayList和Linkedlist都实现List接口。
Arraylist的底层是通过数组实现,其支持随机访问,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个元素和后一个元素链接起来,查找某个元素的时间复杂度为O(n)
相对于ArrayList,LinkedList的插入,增加,删除速度更快,因为其不需要像数组那样插入时需要重新计算索引
LinkedList比ArrayList占用更大的内存,因为Linkedlist为每个节点存储俩个引用,一个指向前一个元素,另一个指向后一个元素。
发表于 2016-03-19 19:30:39 回复(0)
arrayList是一个基于索引的数据存储方式,底层是数组存储,查询速度快,不易于插入和修改,每次插入数据时都会判断数组是否满,如果满了则扩容是原来的1.5倍,初始容量为10,没满的话会创建一个新的数组,将旧的元素复制到新的数组中,修改也是创建一个新数组。
linkedList底层是链表存储的,是一个双向链表,查找速度慢,易于插入和修改,链表的个体是数据域和指针域,linkedList 比arrayList更占内存,因为链表中的每一个节点对存储了两个引用,一个指向前一个一个指向后一个。,
发表于 2020-09-01 16:43:00 回复(0)
从源码来看,ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。
所以,当插入的数据量很小时,两者区别不太大;当插入的数据量大时,大约在容量的1/10之前,LinkedList会优于ArrayList;在其后就完全劣于ArrayList,且越靠近后面越差
个人认为,首用ArrayList
发表于 2019-05-09 17:05:34 回复(0)
ArrayList与LinkedList主要有以下的不同:
  1. 底层实现不同
  2. 访问、插入、删除的效率不同
  3. 存储所占内存大小不同
发表于 2017-08-17 10:57:22 回复(0)
linkedlist实现了deque的接口,这个接口提供了堆栈和双端队列的操作,而arraylist的底层是数组,提供基于数组的操作。
发表于 2016-01-11 22:56:16 回复(0)
linkedlist是双向链表,next指向后一个元素,previous指向前一个元素
发表于 2017-11-11 16:37:39 回复(0)
ArrayList底层采用数组,LinkedList底层采用链表
LinkedList的插入删除速度更快,并且也占用更大的存储空间,因为每个节点都保有前后节点的引用
发表于 2015-11-23 16:52:03 回复(0)
ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删
发表于 2017-08-05 18:48:29 回复(9)
arraylist底层是数组,是随机访问。 linkedlist以元素列表存储,是顺序访问。 arraylist随机访问,说明查找快。linkedlist顺序访问,说明增删改快。 linkedlist占用内存更多,因为它每个节点有2个引用,一前一后。
发表于 2020-12-17 12:26:26 回复(0)
compare采取策略模式方式。 comparable采取内部排序,对于基本数据类型或重写compareTo方法的可直接使用。 compartor则是外部排序
发表于 2020-12-15 11:17:02 回复(0)
<p>arraylist查找快,增删慢</p><p>linkedlist查找慢,增删快</p><p><br></p>
发表于 2020-10-21 17:51:36 回复(0)
ArrayList是基于数组实现。LinkedList是基于链表实现。ArrayList查找好用,LinkedList插入删除好用。
编辑于 2020-08-31 15:44:56 回复(0)
ArrayList底层是通过数组实现的,LinkedList是基于一个双向链表实现的
ArrayList查找元素快,增加删除元素慢,而LinkedList与它正好相反
ArrayList的空间是动态变化的,每次添加元素前在底层都会先判断存储数组的空间是否已满,如果已满则需要扩容,每次扩容是原来的1.5倍,默认初始容量为10
发表于 2020-06-28 18:36:31 回复(0)
<p>1.底层实现</p><p>2.查找,增删的效率</p><p>3.占用内存</p>
发表于 2020-05-31 21:17:12 回复(0)

arraylist底层是数组

linkedlistlist底层是链表

arraylist主要用于查询数据效率快,插入修改删除比较慢

linkedlist主要用于插入修改和删除效率快、查询效率慢

编辑于 2020-03-20 21:29:37 回复(0)

arraylist增删慢,查询,修改快,底层是数组实现

linklist增删快,查改慢,底层是链表实现

编辑于 2020-03-04 12:14:48 回复(0)

arraylist是数组的实现,查找快,修改慢。linklist是链表的实现,查找慢,修改快。

发表于 2020-02-29 21:06:46 回复(0)
arraylist底层是数组,方便查询 linkedlist底层是链表,方便增删 ,lineklist每个元素要存储两个索引,所以更占内存
编辑于 2019-11-20 19:24:41 回复(0)

array list基于数组形式,适合查找

linkedlist 基于链表形式,适合增删改

发表于 2019-09-23 15:19:57 回复(0)