JDK1.8中LinkedList的实现原理及源码分析

详见:https://blog.csdn.net/cb_lcl/article/details/81222394

一、概述
           LinkedList底层是基于双向链表(双向链表的特点,可以看下我的另外一篇博文:https://blog.csdn.net/cb_lcl/article/details/81217972),链表在内存中不是连续的,而是通过引用来关联所有的元素,所以链表的优点在于添加和删除元素比较快,因为只是移动指针,并且不需要判断是否需要扩容,缺点是查询和遍历效率比较低。

二、源码分析

2.1 类结构

**
 *LinkedList底层是双链表。
 *实现了List接口可以有队列操作
 *实现了Deque接口可以有双端队列操作
 *实现了所有可选的List操作并且允许存储任何元素,包括Null
 
 *所有的操作都提现了双链表的结构.
 *索引进入List的操作将从开始或者结尾遍历List,无论任何一个指定的索引
 *
 *注意:这些实现(linkedList)不是同步的,意味着线程不安全
 *如果有多个线程同时访问双链表,至少有一个线程在结构上修改list,那么就必须在外部加上同步操作(synchronized)(所谓的结构化修改
 *操作是指增加或者修改一个或者多个元素,重新设置元素的值不是结构化修改),通常通过自然地同步一些对象来封装List来完成
 *
 *如果没有这样的对象存在,那么应该使用Collections.synchronizedList来封装链表。
 *最好是在创建是完成,以访问意外的对链表进行非同步的访问。
 *如:List list = Collections.synchronizedList(new LinkedList(...));
 *
 *此类的迭代器和迭代方法返回的迭代器是快速失败的:如果链表在迭代器被创建后的任何时间被结构化修改,除非是通过remove或者add方法操作的,
 *否则将会抛出ConcurrentModificationException异常,因此,面对高并发的修改,迭代器以后快速而干净的失败以防承担
 *冒着未确定的任意,非确定性行为的风险
 *
 *注意:迭代器快速失败的行为不能保证,一般来说,在存在并发修改的情况下不能确保任何的承诺,失败快速的迭代器
 *尽最大努力抛出ConcurrentModificationException异常,因此,编写一个依赖于此的程序是错误的。
 *正确性异常:迭代器的快速失败行为应该只用于检测错误
 *
 * @author cb
 *
 * @param <E>
 */
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

2.2 成员变量和构造方法

/**
     * 当前存储的元素个数
     */
transient int size = 0;
 
/**
 * 
 * 首节点
 */
transient Node<E> first;
 
/**
 * 末节点
 */
transient Node<E> last;
 
/**
 * 空构造器
 */
public LinkedList() {
}
 
/**
 *传入集合参数的构造器
 */
public LinkedList(Collection<? extends E> c) {
    this();//调用当前类的构造函数
    addAll(c);
}

从上面可以看到LinkedList两个构造函数,一个无参,一个有参,有参的构造函数的功能是通过一个集合参数,并把该集合里面的所有元素插入到LinkedList中,注意这里是“插入”而不是说“初始化添加”,因为LinkedList并非线程安全,可能在this()调用之后,已经有其他的线程向里面插入数据了。

版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/lukelook/p/11091825.html