
定义
LinkedList的本质是双向链表,与ArrayList相比,LinkedList的插入和删除速度更快,但是随机访问速度则很慢。LinkedList除了实现AbstractLIst抽象类外,还实现了另一个接口Deque,即double-ended queue,这个接口同时具有队列和栈的性质。
1 | public class LinkedList<E> |
由于链表是使用节点的方式,将内存单元通过附加引用的方式关联的,所以初始化的时候,是不需要指定容量的,也不存在扩容一说。
增添
LinkedList默认在尾部增添节点,所以add方法效率有可能高于ArrayList,因为有可能扩容,涉及到数组的复制
add(ele)
1 | public boolean add(E e) { |
add(index,ele)
1 | public void add(int index, E element) { |
当插入下标等于尾节点时,插入尾部,否则,调用 linkBefore方法,插入下标处
1 | void linkBefore(E e, Node<E> succ) { |
这里用到了node方法,寻找下标的位置元素
1 | Node<E> node(int index) { |
可以看到,node方法进行了一些优化,不是全部遍历的,而是根据靠近头节点还是尾节点进行遍历(相比于全部遍历速度提升了一倍)
删除
remove(index)
1 | public E remove(int index) { |
remove(obj)
1 | public boolean remove(Object o) { |
remove(obj)方法是和ArrayList一样的,从头开始遍历,没什么区别!
clear()
1 | public void clear() { |
遍历
1 | private class ListItr implements ListIterator<E> { |