您的位置 首页 java

Java集合——LinkedList源码学习

Coding on the way

LinkedList是通过 链表 的数据结构,比较适合用于增删改,而ArrayList基于数组的数据结构,比较适合查找。LinkedList同样是异步的,当多个线程进行操作的时候,建议通过 创建实例。

LinkedList实现了List接口和 Queue 接口,因此我们可以把LinkedList当成Queue来用。Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用 poll ()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用 element ()或者peek()方法。

前面我们对ArrayList的学习,知道ArrayList是通过数组进行实现。通过平常的了解,我们也知道LinkedList是基于链表进行实现的,带着几个疑惑来学习下。

  1. LinkedList的实现原理

  2. LinkedList是否线程安全

  3. LinkedList常见方法的 时间复杂度 和空间复杂的

LinkedList的创建

从这里可以看到类Link的结构,是不是跟当初学习链表的时候Node结构体特别相似,确实这个就是LinkedList实现的基础,也可以侧面证实LinkedList是给予链表实现的。通过上述可以看到LinkedList初始化大小size=0;然后创建一个Link节点。通过上面我们也可以看到,这里是 通过循环 双向链表 进行实现。

public LinkedList()

在无参 构造方法 中,首先创建一个空的Link对象,然后将Link的previous和next节点指向自身。最终完成创建一个空节点。

LinkedList常见方法

public boolean add(E object) :添加元素

在add方法中插入一个元素,操作步骤如下:

  1. 先保存节点voidLink.previous节点,即断开连接;

  2. 将object构建新节点;

  3. 将新节点链接到voidLink.previous几点上;

  4. 在将新节点连接到oldLink节点上。

这里的插入方式就是链表中的尾插法。链表中的插入方法有前插法和尾插法。

public void add(int location, E object)

在add方法中,添加的位置必须location>=0&&location<=size。如果不符合则跑出IndexOutOfBoundsException异常。由于是双向循环链表,在插入的时候,先判断插入的位置是在size的前半段还是后半段,如果在前判断,则只需要变动0-location之间元素,如果在后半段,则变动location-size之间的元素位置。

public boolean contains(Object object)

在contains方法中,我们看到LinkedList在判断的时候也是通过遍历节点,然后判断,如果这个节点在最后,那么久会遍历到最后一个节点才判断出来结果,所以是非常费时的操作。

public E get(int location)

在get方法中,LinkedList的实现也是通过逐节点的遍历,然后找到指定的节点值,进行返回。

public E getFirst()和public E getLast()

因为是双向循环链表,所以getFirst返回的就是头结点voidLikn.next.data的值,getLast返回的就是voidLink.previous.data的值。

LinkedList实现Queue接口方法

offerFirst和offerLast

通过查看addFirstImpl和addLastImpl的实现,可以看到实现的方式是往链表的头部或尾部添加元素。

peek类方法

通过上面源码可以看出,通过peek方法获取元素,但是不删除元素,poll方法会删除元素。

主要就介绍这么多吧!有兴趣的可以去看下源码学习下。

欢迎评论交流学习,烦请大佬顺便点个关注。

文章来源:智云一二三科技

文章标题:Java集合——LinkedList源码学习

文章地址:https://www.zhihuclub.com/195758.shtml

关于作者: 智云科技

热门文章

网站地图