用arraylist还是linkedlist?看完你就懂了!(代码片段)

Java技术栈 Java技术栈     2022-12-24     264

关键词:

本文旨在为 Java 开发这择合适的顺序数据结构提供指导。

ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

1. List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。

2. 用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

import java.util.*;
public class MyClass 
  // 非同步或非线程安全
  List<Object> arrayList = new ArrayList<>(); // 声明一个 array list
  List<Object> linkedList = new LinkedList(); // 声明 linked list
  // 确保线程安全
  List<Object> tsArrayList = Collections.synchronizedList(new LinkedList<>());
  List<Object> tsLinkedList = Collections.synchronizedList(new LinkedList<>());

Vector 与 ArrayList 类似,只是它们支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。

3. 内部实现

3.1 LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。 序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。

3.2 ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。 它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。

它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList<type>(initialCapacity)
List arr = new ArrayList<Integer>(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。 Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。

4. 各种操作的时空复杂性

5. 小贴士

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();
…
…
Object o = null;
for (int i = 0; i < list.size(); i++)

  o = list.get(i);
  …

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();
…
…
Object o = null;
ListIterator li = list.listIterator(0);
while (li.hasNext())
  o = ll.next();
  …

6. 总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。 遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。 如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。

欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。

原文:https://dzone.com/articles/arraylist-or-linkedlist
翻译:唐尤华

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2021最新版)

2.别在再满屏的 if/ else 了,试试策略模式,真香!!

3.卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅发布,黑暗模式太炸了!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

arraylist和linkedlist区别?看完秒懂~

...经常分不清楚,什么时候用ArrayList,什么时候用LinkedList?所以我们应该弄清楚ArrayList和LinkedList之间的区别,然后才知道工作中该如何选型。一、ArrayList和LinkedList查询之间的区别首先,从名字就可以看出,... 查看详情

ArrayList 还是 LinkedList 哪个运行得更快? [复制]

】ArrayList还是LinkedList哪个运行得更快?[复制]【英文标题】:Whichonerunsfaster,ArrayListorLinkedList?[duplicate]【发布时间】:2013-09-1502:16:43【问题描述】:Listli=newLinkedList();for(inti=0;i&lt;100;i++)li.add(i);longstart1=System.nanoTime();li.ge 查看详情

linkedlist作者说他自己都不用linkedlist?看完给我整不会了。。(代码片段)

今天在网上冲浪,就看到有文章写说LinkedList的作者说他自己都不用LinkedList,感觉既惊讶,又有点意思。可能这就是大佬吧,我造轮子,但是我不用!或者这就是传说中的厨子不吃自己做的菜?不扯了&#... 查看详情

arraylist、linkedlist、hashmap哪个速度更快

ArrayList、LinkedList、HashMap查询单个元素时速度比较?ArrayList、LinkedList、HashMap遍历整个集合时速度比较?ArrayList、LinkedList、HashMap增删时速度比较?ArrayList、LinkedList、HashMap在不同情况该用哪种?要回答这个问题,要写很多内容,... 查看详情

arraylist和linkedlist区别,举例说明下

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

数据结构:用实例分析arraylist与linkedlist的读写性能(代码片段)

目录背景ArrayListLinkedList实例分析1、增加数据2、插入数据3、遍历数据3.1、LinkedList遍历改进总结背景ArrayList与LinkedList是Java编程中经常会用到的两种基本数据结构,在书本上一般会说明以下两个特点:对于需要快速随机访问元素... 查看详情

arraylist和linkedlist的执行效率比较

...ayList进行向前和向后遍历,不要用它删除和插入元素;与LinkedList相比,它的效率要低许多LinkedList提供优 查看详情

linkedlist和list的区别

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

arraylist和linkedlist底层实现的区别

ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删。ArrayList与LinkList两者的区别:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对... 查看详情

tojava程序员:切勿用普通for循环遍历linkedlist

ArrayList与LinkedList的普通for循环遍历对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法:publicstaticvoidmain(String[]args){List<Integer>arrayList=newArrayList<Integer>();for(inti= 查看详情

接口和多态

...空间放list引用,并没有创建对象所以不知道ArrayList还是LinkedList当你list=newArrayList();就创建了ArrayList对象。并且把开始创建的list引用指向这个对象ArrayList和LinkedList都是List的实现类。为什么一般都使 查看详情

ArrayList vs LinkedList Java [重复]

】ArrayListvsLinkedListJava[重复]【英文标题】:ArrayListvsLinkedListJava[duplicate]【发布时间】:2014-09-1718:34:30【问题描述】:ArrayList和LinkedList有什么区别?我看过TheNewBoston的一段视频,但我仍然很困惑。请用简短的形式和简单的英语回... 查看详情

tojava程序员:切勿用普通for循环遍历linkedlist(转)

ArrayList与LinkedList的普通for循环遍历对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法:publicstaticvoidmain(String[]args){List<Integer>arrayList=newArrayList<Integer>();for(inti= 查看详情

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

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

java中arraylist和linkedlist有啥区别,分别怎么使用呢

取个例子啊ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删。ArrayList与LinkList两者的区别:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时... 查看详情

集合泛型回顾加强

...和区别:set是无序且不可重复,list是有序可重复。三。linkedlist与ArrayList的区别:选用list时候用linedlist还是arraylist也要看他们的特点来区别对待:linkedlist是用链表来实现的,修改容易,查找困难,而ArrayList是用数组实现的,查... 查看详情

arraylist和linkedlist的区别

...上大概可以猜出ArrayList是用数组实现的的一种数据结构;LinkedList采用链表实现。那么要剖析区别的话大概可以概括到数组和链表的区别。结合在数据结构课上所学,我大概可以猜出几点区别,无外乎数组采用连续的内存空间存... 查看详情

如何快速从list中查找一条数据(代码片段)

...,其实考了很多点首先先问问,你这个List是ArrayList还是LinkedList那么为什么要问这个呢,ArrayList和LinkedList区别我就不介绍了吧,ArrayList数组结构,LinkedList链表结构。ArrayList测试结果for循环测试结果:11920foreach循环测试结果:15765... 查看详情