1.基本特性:
- 基于List接口,以双向链表的形式实现
- 在插入/删除 性能上 优于 ArrayList, 在随机访问 上 差于 ArrayList
- 允许所有元素为NULL
- 实现Deque接口,可以基于LinkedList 进行堆栈,双端队列操作
- 线程不安全,若有需要,可以使用
Collections.synchronizedList()
方法进行转换成线程安全的 - 支持序列化,实现了Serializable接口
- 实现了Clone 接口
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable {
transient int size;
transient LinkedList.Node<E> first;
transient LinkedList.Node<E> last;
private static final long serialVersionUID = 876323262645176354L;
}
2.基本API 源码实现
1,set() 方法 :
public E set(int index, E element) {
checkElementIndex(index);//检查是否越界
Node<E> x = node(index);//获取对应索引位置的结点
E oldVal = x.item;
x.item = element;//赋新值
return oldVal;
}
2.get()方法
public E get(int index) {
checkElementIndex(index);//检查是否越界
return node(index).item;//返回对应索引的节点
}
分析:
set(),get()
方法逻辑都很简单明了,都需要 先检查索引,然后通过 node(int index)
函数获得节点,node()
函数这里我们打开看一下:
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;
}
}
该函数以 O(n/2) 的性能去寻找index位置上的结点 :
- 先以size的中间为界限,判断index在size的前一半还是后一半,
size >> 1
表示位运算,相当于 size/2. - 如果是index在前一半,则从head节点开始向后查找
- 如果是后一半,则从尾节点 开始向前查找
3.常见API
添加方法:
- boolean add(E e) : 添加元素到列尾
- void add(int index,E e) : 添加元素到指定位置
- boolean addAll (Collection< ? extends E > c) : 添加集合到列尾
- boolean addAll(int x,Collection< ? extends E > c) : 添加集合到指定位置
- void addFirst(E e) : 添加元素到列的头部
- void addLast(E e) : 添加元素到列尾
查找方法:
- E element() : 获取表头元素
- E get(int index) : 获取指定位置的元素
- E getFirst() : 获取表头元素
- E getLast() : 获取列尾元素
- int indexOf(Object o) : 返回链表中第一次出现指定元素的索引,否则返回-1
- E poll() : 获取并删除表头元素
- E pollLast() : 获取并删除列尾元素,没有则返回空
删除方法:
- void clear() : 清除列表的所有元素
- E remove() : 删除并返回表头元素
- E remove(int index) : 删除并返回指定位置的元素
- E removeLast() : 删除并返回列尾元素
- boolean removeFirstOccurrence(Object o) :删除并返回第一次出现的指定元素
- boolean removeLastOccurrence(Object o) :删除并返回最后一次出现的指定元素
其他:
- boolean contains(Object o) : 是否含有指定元素
- E set(int index,E e) : 设置指定位置的值