系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
- 第一章 String
- 第二章 Integer
- 第三章 ArrayList
- 第四章 LinkedList
- 第五章 HashMap
- 第六章 ConcurrentHashMap
- 第七章 AbstractQueuedSynchronizer(AQS)
- 第八章 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
}
总结🐯🐯🐯
提示:这里对文章进行总结:
后期慢慢补充🐸🐸🐸