前言
上一篇文章我们提到了ArrayList(点击打开链接),ArrayList是一种基于Object数组的数据结构。而今天我们提到的LinkedList是一种基于双向链表的数据结构。也就是说LinkedList具有与双向链表相同的属性。ArrayList、LinkedList、Vector三者在笔试面试中是重要考点(当然HashMap、Hashtable、ConcurrentHashMap三者之间的区别和源码才是重点中的重点,我会在之后的源码系列中说出我的理解,敬请期待!)。好了,下面我们上源码!
- * 概述:
- * LinkedList是List和Deque接口的双向链表的实现。实现了所有可选List操作,并允许包括null值。
- * LinkedList既然是通过双向链表去实现的,那么它可以被当作堆栈、队列或双端队列进行操作。并且其顺序访问非常高效,而随机访问效率比较低。
- * 内部方法,注释会描述为节点的操作(如删除第一个节点),公开的方法会描述为元素的操作(如删除第一个元素)
- * 注意,此实现不是同步的。 如果多个线程同时访问一个LinkedList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。
- * LinkedList不是线程安全的,如果在多线程中使用(修改),需要在外部作同步处理。
- * 这通常是通过同步那些用来封装列表的对象来实现的。
- * 但如果没有这样的对象存在,则该列表需要运用{@link Collections#synchronizedList Collections.synchronizedList}来进行“包装”,该方法最好是在创建列表对象时完成,为了避免对列表进行突发的非同步操作。
LinkedList的属性
transient int size = 0; |
链表大小 |
transient Node<E> first; |
头结点引用 |
transient Node<E> last; |
尾结点引用 |
通过以上属性来看,LinkedList是一种具有头、尾结点的双向链表。Node是LinkedList的私有内部类。有三个属性。分别是指向前驱节点的前驱指针、指向后驱节点的后驱指针和该结点对应的值。Josh Bloch在API中引入“All of the operations perform as could be expected for a doubly-linked list. Operations that index into the list will traverse the list from the beginning or the end, whichever is closer to the specified index.”
翻译过来大致就是“对于双链表,所有的操作都是可以执行的。索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引。”所以对LinkedList的方法不在详细说明。不明白就自己看一下源码吧。