LinkedList:底层源码定义一个双向链表
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;
}
}
定义了两种添加元素方式:
1.在链表头部添加元素
private void linkFirst(E e) {
final Node<E> f = first;
final Node<E> newNode = new Node<>(null, e, f);
first = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode;
size++;
modCount++;
}
2.在链表尾部添加元素:
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(),addFirst(),调用linkFirst()方法,直接在头部添加元素
add(index,element),在指定位置添加元素,通过size锁定位置,然后在其前部添加
push(),offerFrist()调用addFirst,模拟栈功能,在队头插入
offer(),offerLast()调用addList,模拟队列功能,在队尾插入
-----------------------------------------------------------------
删除元素:源码定义了2中删除元素的方法:
1.删除链表头部元素
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
2.删除链表尾部元素
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null; // help GC
last = prev;
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}
其中删除元素的方法:
remove()、removeFirst()、pop()、poll()、pollFirst()
都是调用的unlinkFirst()方法
removeList()、pollLast()都是调用unlinkLast的方法。
push()和pop()是模拟栈存储。先进后出(FILO),在头部操作
offer()和poll()是模拟队列存储,先进先出(FIFO),在尾部进队,头部出队操作
offerFirst()、offerLast()和pollFirst()、pollLast()模拟双向队列,在尾部可以进队出队,在头部可以进队出队