Java 集合框架之 List 系列
LinkedList 学习总结 - 基于JDK1.8
ps:所有总结均是个人查看源码手写总结,未借鉴其他博客,转发请标明出处
LinkedList 继承关系图:
上级接口:List, Deque, Cloneable, Serializable
上级抽象类:AbstractSequentialList
LinkedList属性
int size:内部元素实际使用数量
transient Node first:首节点
transient Node last:尾节点
内部类 Node,每个Node对象就是一个元素
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;
}
}
无参构造函数: 内部无操作
传入Collection对象的有参构造函数
public LinkedList(Collection<? extends E> c) {
this();
// 主要是调用了addAll方法,接下来又会调用addAll(size, c),将c对象元素插入链表
addAll(c);
}
add(E e)方法
会调用linkLast(E e)方法, 默认在链表的尾部插入新元素
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(int index, E e)方法, 在指定位置添加元素
public void add(int index, E element) {
// 检查下标是否越界
checkPositionIndex(index);
// index等于size,则是在链表的末尾直接插入
if (index == size)
linkLast(element);
else
// 否则定位到index所在位置进行插入
// 注意node方法,index小于size一半时从前往后找,否则从后往前找
linkBefore(element, node(index));
}
remove()方法
public E remove() {
// 删除链表的第一个元素
return removeFirst();
}
特别之处:由于LinkedList是实现了Deque接口的,所以其本身是可以当队列使用的,内部提供了队列操作的有关方法,例如offer(), poll()等
总结:
LinkedList的底层实现实际是链表,而且是一个双向链表,这就是其与ArrayList最大的区别,同时也是链表与数组的区别,链表在指定位置做插入的效率高于数组,而不具有数组的随机访问特性。同时当需要使用队列时,LinkedList也是一个不错的选择