文章目录
前言
本文章分析LinkedList源码。
一、LinkedList概述
- LinkedList是双向链表实现的List
- LinkedList是非线程安全的LinkedList元素允许为null,允许重复元素
- LinkedList是基于链表实现的,因此插入删除效率高,查找效率低
- LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法
- LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用
二、LinkedList
2.1、LinkedList的存储结构
LinkedList采用的是双链表数据结构组成
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;
}
}
根据源码可以知道,它定义了一个它有一个Node内部类,作为链表里的节点,一个节点包含 E item、Node next、Node prev三个内容,其中item用来保存数据,next用于指向下一个节点Node,prev用来指向上一个节点。它还用transient 关键字定义了头节点和尾节点Node first和Node last用于指向第一个节点和最后一个节点。
存储结构图:
三、常用方法
3.1add()
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);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
当调用add()方法时&#x