LinkedList 从实现的角度来分析,它实现了 Deque 接口,所以不仅可以作为队列(FIFO)使用,还可以作为栈(LIFO)使用

  1. public class LinkedList<E>
  2. extends AbstractSequentialList<E>
  3. implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
  4. transient int size = 0;
  5. /**
  6. * Pointer to first node.
  7. * Invariant: (first == null && last == null) ||
  8. * (first.prev == null && first.item != null)
  9. */
  10. transient Node<E> first;
  11. /**
  12. * Pointer to last node.
  13. * Invariant: (first == null && last == null) ||
  14. * (last.next == null && last.item != null)
  15. */
  16. transient Node<E> last;
  17. }
  1. private static class Node<E> {
  2. E item;
  3. Node<E> next;
  4. Node<E> prev;
  5. Node(Node<E> prev, E element, Node<E> next) {
  6. this.item = element;
  7. this.next = next;
  8. this.prev = prev;
  9. }
  10. }

ListIterator

LinkedList 有一个方法 listIterator,会拿到迭代器,他与传统的迭代器不同,可以获取上一个元素,和判断上一个元素是否存在,由于 LinkedList 没有实现 RadomAccess 接口,所以他的 for 循环效率低于 iterator

  1. public interface ListIterator<E> extends Iterator<E> {
  2. boolean hasNext();
  3. E next();
  4. boolean hasPrevious();
  5. E previous();
  6. int nextIndex();
  7. int previousIndex();
  8. void remove();
  9. void set(E e);
  10. void add(E e);
  11. }

LinkedList 由于是链表形式,所以他的 get 的效率很低,因为每次都要进行二分查找,确定位置,然后再进行遍历操作,所以在使用 LinkedList 的时候推荐使用 iterator

  1. public E get(int index) {
  2. checkElementIndex(index);
  3. return node(index).item;
  4. }
  5. Node<E> node(int index) {
  6. // assert isElementIndex(index);
  7. if (index < (size >> 1)) {
  8. Node<E> x = first;
  9. for (int i = 0; i < index; i++)
  10. x = x.next;
  11. return x;
  12. } else {
  13. Node<E> x = last;
  14. for (int i = size - 1; i > index; i--)
  15. x = x.prev;
  16. return x;
  17. }
  18. }