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;
}
}
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;
}
}
调用add方法增加数据时,是把当前数据放到链表的最末端,及后进后出:
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++; }
可以看到LinkedList是直接把新元素插入到指定位置的,而ArrayList插入新元素时可能还要扩容以及数据复制带来的开销。
取数据时:
public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) {//确认在上半区还是在下半区 Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }
所以LinkedList取数据是比ArrayList慢的。