啃掉JDK源码(四):LinkedList

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

  1. 第一章 String
  2. 第二章 Integer
  3. 第三章 ArrayList
  4. 第四章 LinkedList
  5. 第五章 HashMap
  6. 第六章 ConcurrentHashMap
  7. 第七章 AbstractQueuedSynchronizer(AQS)
  8. 第八章 ReentrantLock

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

ArrayList 在上一篇已经简单的记录,这篇文章记录LinkedList!❤️❤️❤️

提示:以下是本篇文章正文内容,下面案例可供参考

源码分析

在这里插入图片描述
LinkedList 底层基于双向链表实现,有 first 首节点和 last 尾节点
每个节点里边包含item ,next 指向后一个节点,prev 指向前一个节点
LinkedList 元素添加和删除,不是通过数组来完成的,所以效率比较快

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
    
	 //元素数量    
	 transient int size = 0;
	 //第一个结点
	 transient Node<E> first;
	 //最后一个结点
	 transient Node<E> last;
	 .....
}

 private static class Node<E> {
	 E item;
	 Node<E> next;
	 Node<E> prev;
	 Node(Node<E> prev, E element, Node<E> next) {
	     this.item = element;
	     this.next = next;
	     this.prev = prev;
	 }
}

remove

public E remove() {
   return removeFirst();
}

public E removeFirst() {
    final Node<E> f = first;
    if (f == null)
        throw new NoSuchElementException();
    return unlinkFirst(f);
}
private E unlinkFirst(Node<E> f) {
    // assert f == first && f != null;
    final E element = f.item;// 用于方法返回
    final Node<E> next = f.next;// 取出头结点的下一个节点的引用并赋予变量next
    f.item = null; // 将头结点的item以及next属性设为null,帮助垃圾回收
    f.next = null; // help GC
    first = next;// 将next赋予first(将原先节点下一个节点变为头结点)
    if (next == null)// 判断next是否为空,空说明只有一个元素,将last设置null
        last = null;
    else // 如果next不为空,则将next的prev设置为null(因为prev指向原先的头结点,头节点的prev值肯定为null)
        next.prev = null;
    size--;
    modCount++;
    return element;
}

add

public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null); // 设置newNode的前结点为l,后结点为null
    last = newNode;// 新结点变成最后一个结点
    if (l == null) // 若l == null说明是首次链接元素,将first也指向新结点
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;// 修改次数+1
}

总结🐯🐯🐯

提示:这里对文章进行总结:

后期慢慢补充🐸🐸🐸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小心仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值