JAVA源码系列-LinkedList

前言

上一篇文章我们提到了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的方法不在详细说明。不明白就自己看一下源码吧。

猜你喜欢

转载自blog.csdn.net/qq_34218892/article/details/81282647