1、底层为双向链表
2、内部类:
private static class Node<E> { E item; //本身 Node<E> next; //下一个,如果该元素是最后一个,那么next == null Node<E> prev; //上一个,如果该元素为第一个,那么prev == null Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
3、add(E e),默认是增加在最后,与之相似的还有addFirst(E),addLast(E),offer(E),offerFirst(E),offerLast(E)原理相同,push(E e)是默认的增加在第一个
public boolean add(E e) { linkLast(e); return true; }
/** * Links e as last element. */ void linkLast(E e) { final Node<E> l = last; //获取最后一个元素 final Node<E> newNode = new Node<>(l, e, null); // newNode成为了last last = newNode; if (l == null) first = newNode; //如果空数组的情况 else l.next = newNode; //反之不空的情况 size++; modCount++; }
4、remove(Object o) 如果是remove()是默认移除removeFirst()
public boolean remove(Object o) { if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }
//比如为1,2,3,要移除的是2
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item; //2
final Node<E> next = x.next; //3
final Node<E> prev = x.prev; //1
if (prev == null) {
first = next;
} else {
prev.next = next; //1的next指向3
x.prev = null;
}
if (next == null) {
last = prev; //如果next==null,代表x为last,那么last=prev
} else {
next.prev = prev; // 3 指向 1
x.next = null;
}
x.item = null;
size--;
modCount++;
return element;
}
5、set(int index, E element)
public E set(int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; }
6、peek的都是获取的方法,poll是移除的方法,这些都是允许LinkedList为空。element()获取第一个,前提是LinkedList不为空,否则抛出NoSuchElementException
public E peek() { final Node<E> f = first; return (f == null) ? null : f.item; }
public E peekFirst() { final Node<E> f = first; return (f == null) ? null : f.item; }
public E peekLast() { final Node<E> l = last; return (l == null) ? null : l.item; }
public E poll() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); }
ublic E pollFirst() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); }
public E pollLast() { final Node<E> l = last; return (l == null) ? null : unlinkLast(l); }
public E element() { return getFirst(); }
7、总结,ArrayList和LinkedList的区别
- ArrayList的插入,删除数据慢,查询快
- LinkedList的插入,删除数据快,查询慢