LinkedList实现了List接口与Deque接口。Deque解开意思是“Double End Queue”(双端队列),这个队列定义了2端可以插入或者删除元素,可以实现为无容量限制的队列,也可以实现为有容量限制的队列,LinkedList采用的有容量限制的实现,最大容量为Integer.MAX_VALUE。
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;
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;
}
}
}
Node是一个静态内部类。Node代表链表基本数据元素,封装了数据本身和两端指针。
有限容量的链表实现Node定位有段代码比通常的思路好一些,通过判断index靠近头还是尾,再遍历:
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;
}
}
比较LinkedList和ArrayList
相同点:
- 接口实现:都实现了List接口,都是线性列表的实现
- 线程安全:都是线程不安全的
不同点:
- 底层实现,ArrayList是数组,而LinkedList是双向链表
- 接口实现,ArrayList实现了RandomAccess支持随机节点快速访问,LinkedList实现了Deque,可以作为队列使用。
- 性能:新增、删除元素时ArrayList需要使用到拷贝原数组,而LinkedList只需移动指针;查找元素 ArrayList支持随机元素访问,而LinkedList只能一个节点的去遍历。简要来说,ArrayList适合查找,LinkedList适合增删。(如果ArrayList增删只考虑从末尾操作,那么就无需移动数组,速度反而会异常的快。)
参考文章:
Java容器之LinkedList
网友评论