Java零基础手把手系列:LinkedList入门以及和ArrayList异同

目录

1. 概述

源码里面的注释说:LinkedList一种双向链表的实现,实现了接口List和Deque(Java零基础手把手系列:Queue最简入门),它实现了所有链表的操作,可以存储任何元素,包括null。

/**
 Doubly-linked list implementation of the {@code List} and  {@code Deque} interfaces.  Implements all optional list  operations, and permits all elements (including {@code null}).
 ...
 **/

本文将讲述该数据结构的基本类型和方法,并举例说明其简单的应用。

2. 特性

我们先来看一下LinkedList的一些基本特性:

  • 它的底层数据结构是一个叫Node的节点:
    在这里插入图片描述
  • 通过index获取元素很慢,因为需要从头到尾的遍历(虽然源码里面有加速实现:如果index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找)
  • 他不是同步的,不是线程安全的
  • 它的Iterator和ListIterator迭代器是fail-fast的(什么意思呢,指的是在获取到迭代器之后,如果修改了列表,将抛出一个ConcurrentModificationException)
  • 每一个元素都是一个Node节点,该节点保存了前一个元素、后一个元素的引用
  • LinkedList维持插入的顺序

3. LinkedList vs ArrayList

虽然两者都是List接口的实现类,但是还是有自己的特点,不同的特点决定了什么样的场景该使用哪一个

3.1 底层实现结构

ArrayList查询快

  • ArrayList的底层数据结构是数组,可以通过index随机获取元素,且时间复杂度是O(1)
  • LinkedList底层数据结构是链表,也就是每一个元素都会保存他的前一个,后一个元素的引用。因此,在LinkedList上面的查询操作是O(n)
    在这里插入图片描述
3.2 基本操作

插入、添加、删除操作LinkedList比ArrayList快

  • LinkedList做上述操作的时候,只需要改变其previous和next指针的引用即可
  • ArrayList做上述操作,需要resize或者update index
3.3 内存占用

ArrayList更省内存

  • ArrayList每一个元素只需要保存它的data和index
  • LinkedList每一个元素除了data,还有previous和next引用

4. 基本用法

本小节展示LinkedList的基本使用

4.1 Create LinkedList(同步和非同步)

默认的创建如下:

LinkedList<String> linkedList = new LinkedList<>();

虽然LinkedList不是线程安全的,但是我们可以通过调用Collections.synchronizedList方法创建它的同步版本:

List list = Collections.synchronizedList(new LinkedList(...));
4.2 添加元素

LinkedList实现了List和Deque,所以:

  • add:添加元素到链表尾部
  • addAll:添加指定的一堆元素到链表尾部
  • addFirst:添加元素到链表头部
  • addLast:添加元素到链表尾部
4.3 删除元素

和添加一样,提供removeFirst和removeLast,这里不解释了,特别介绍一下:

  • removeFirstOccurence(Object o):删除第一次出现的元素o,也就是从头到头的遍历,直到发现第一个。如果操作成功返回true
  • removeLastOccurence(Object o):同First的操作,删除最后一次出现的元素o
4.4 队列操作

Deque接口提供Queue的行为(参考文章:4.Java零基础手把手系列:ArrayDeque简洁却不简单入门):

//检索第一个元素
linkedList.poll();
//出队一个元素
linkedList.pop();
//入队一个元素o
linkedList.push(Object o);

poll()和pop()的区别是当列表为空时,pop就会抛出NoSuchElementException()异常,而poll则会返回null。
push将在列表头添加一个元素。

LinkedList还有许多其他操作,使用方式与List和Deque一样,有不懂的可以讨论。

5. 总结

一般情况下,如果使用到List,都会选择ArrayList
但是在有些使用情况下,使用LinkedList会是更好的选择,比如需要频繁的插入,删除,更新列表元素时。
可以添加博主vx交流:crazy042438


Java手把手系列
0.Java零基础手把手系列:Queue最简入门
1.一文读懂Java访问控制符
2.Java零基础手把手系列:HashMap排序方法一网打尽
3.Java零基础手把手系列:ArrayList常见用法
4.Java零基础手把手系列:ArrayDeque简洁却不简单入门
5.重磅好文:图解Java垃圾回收机制,值得收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值