LinkedList 同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。但是关于栈或队列,现在的首选是ArrayDeque,它有着比inkedList(当作栈或队列使用时)有着更好的性能。
总结
1. 底层基于双向链表实现,在内存中是非连续的,增加、删除、修改头尾及已知结点很快,(未知结点)查找较慢。
2. 实现了List,和Deque接口,能将LinkedList当做双端队列使用,既可以作为队列也可以做栈。
3. LinkedList 线程非安全。
4. 可储存多个null。
5. 覆盖了函数clone(),能被克隆
属性
transient int size; // 链表大小
transient LinkedList.Node<E> first; // 指向头结点
transient LinkedList.Node<E> last; // 指向尾结点
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;
}
}
构造方法
两个构造方法:1. 无参构造方法 2. 集合构造方法
主要方法
添加
public boolean add(E e); // 在末尾插入,last指向链表末尾,速度快
public void add(int index, E element); //在Node(index)之前插入,要先找Node,双向链表查迅速度快,但是和ArrayList还是慢一些,LinkBefore()
public boolean addAll(Collection<? extends E> c); // 并非直接调用 add(E e);
public boolean addAll(int index, Collection<? extends E> c); // ModCount+1
/**
将集合连接为一个链表再插入
*/
删除
为了让GC更快可以回收放置的元素,需要将node之间的引用关系赋空。
public void clear() ; // 删除所有元素
public E remove(int index);
修改
public E set(int index, E element)
查找
public E get(int index);
public int indexOf(Object o);
public int lastIndexOf(Object o);
Queue方法
public E peek() // 查看头部的结点
public E element() // 查看头部的结点
public E poll() // 出队列
public E remove() // 出队列
public boolean offer(E e) // 入队列
Stack方法
public boolean offerFirst(E e) // 顶部入栈
public boolean offerLast(E e) // 低部入栈
public E peekFirst() // 显示顶部
public E peekLast() // 显示底部
public E pollFirst() // 出栈(顶部)
public E pollLast() // 出栈(底部)
public void push(E e) // 顶部入栈
public E pop() //顶部出栈
public boolean removeFirstOccurrence(Object o) // 删除以最先出栈的O
public boolean removeLastOccurrence(Object o) // 删除最后出栈的o