1.概述
List的链表实现,是一种双向循环链表
(1)存储的元素允许为NULL
(2)存储的元素允许重复
(3)非线程安全
(4)有序
2.底层实现
LinkedList的的一个内部类
private static class Entry{
E element;
Entry next;
Entry previous;
}
3.构造方法
提供了两个构造方法
public LinkedList():将header结点的前一节点和后一节点都设置为自身
public LinkedList(Collection<? extends E> c):首先调用无参的构造方法构造一个空链表,之后通过addAll将c中的元素全部添加到链表中
4.元素的增删改查
(1)增加
public boolean add(E e):调用了addBefore(E e,Entry entry)方法
public void add(int index,E e):调用了addBefore(E e,Entry entry)方法
public void addFirst(E e):调用了addBefore(E e,Entry entry)方法
public void addLast(E e):调用了addBefore(E e,Entry entry)方法
(2)删除
支持按照元素删除和下标删除
public E remove(int index){
return remove(entry(index));
}
通过下标找到该元素,修改该元素前后结点的指针,并将待删除的Entry的previous、element、next均设置为NULL,让虚拟机可以回收这个Entry
(3)修改
public E set(int index,E element):先获取指定索引的节点,之后保留原来的元素,然后使用element进行替换,并返回原来的元素
(4)查找
public E get(int index):当index小于数组大小的一半时(size>>1),从前开始查找,当index大于数组大小的一半时,从后开始查找
public E getLast():获取header节点的前一个节点的元素,即链表的最后一个节点
public E getFirst():返回链表的第一个节点的元素,即header.next.val
(5)插入
public boolean offer(E e):在链表尾部插入元素
public boolean offerFirst(E e):在链表头部插入元素
public boolean offerLast(E e):在链表尾部插入元素
5.优点
若插入、删除的元素是在数据结构的前半段时,效率较ArrayList高
6.缺点
(1)每次顺序插入时,都会new一个Entry出来,若Entry比较大,则时间会长一些
(2)LinkedList不仅维护了待插入的元素,还需要维护前驱和后继