LinkedList与ArrayList
-
ArrayList有的方法LinkedList也有,执行结果一样,但底层和执行过程不一样。ArrayList底层是数组,执行list.add(2,3)时,需大量后移元素。LinkedList底层是双向链表,执行list.add(2,3)时,不需要大量后移元素,修改节点的指向即可。
-
LinkedList实现了 Deque接口,而Deque继承了Queue,所以LinkedList有更多的方法,如:添加,删除,获取首尾元素的方法:list.addFirst();list.addLast();list.removeFirst();list.removeLast();list.getFirst();list.getLast();
-
大量按照索引查询,遍历时使用ArrayList,较多的添加删除操作使用LinkedList
LinkedList源码
分析list.add()的代码流程:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
}
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++;
}
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;
}
}