就和图中画的一样LinkedList是由很多个这样的节点组成的
prev是存储的上一个节点的引用。
element是存储的具体的内容。
next是存储的下一个节点的引用。
正是因为了这很多个节点,他存放着上一个和下一个节点的引用,就形成了有序的一个链表,就个铁链类似的那种,而且再加上它存的是前后两个节点的引用全部都保存起来, 所以从前往后和从后往前都能增删改查数据,所以他是个双向的链表。
我们再看看他的整体结构。
LinkedList的整体结构图
我们从图解中也能看出点东西来,他有好多的Node,并且还有first和last这两个变量保存头部和尾部节点的信息
还有就是他不是一个循环的双向链表,因为他前后都是null,这个也是我们需要注意的地方
图解看完了,我们看看他的源码解析把。
源码分析
1.变量
构造方法
接下来我们在看看node节点
Node节点
看到这个Node节点,我们就能看出来在图中的意思了,也证明了他是个双向的链表、
添加元素
看完这个addAll方法之后我们再看看其他的添加元素的方法,分为了头部addFist和尾部addLast。
addFist(E e)
将e元素添加到链表并且设置其为头节点Fist
看看代码中的实现方式
详细步骤如下:
1.拿到first节点设置为f;2.新创建一个newNode设置为next节点为f节点;3.然后把newNode赋值给这个first4.如果f为空,则说明列表中没有元素,last指向newNode,否则,前first的前驱指向newNode;
这是代码的意思,我们可以通过一个图来看一下这实现:
下面我们再看看这个addLast(E e)
就是将元素E添加到链表,并且设置为尾部的节点next;
其实过程都差不多,不仔细的去详细讲解了
我们再看看线程安全性问题,ArrayList和LinkedList都是线程不安全的,因为,他内部的方法都没有进行方法同步,或者说是加锁, 这个时候就出了一个我们不经常用的Vector,
Vector
Vector是一个可实现自动增长的数组,他也是一个线程安全的数组。 我们可以去看一下他的源码介绍:
还有很多方法我就不再一一去举例子了,而synchronized关键字表面的意思是 当有两个并发线程同时访问一个对象(synchronized)代码块的时候,在同一个时刻,只能有一个线程得到执行, 而另外的一个线程受到阻塞,必须等待当前线程的代码执行完这个代码块之后才能执行该代码。
也就是说在执行synchronized代码块的时候会锁定当前的对象,只有执行完改代码块之后才能释放锁,下一个线程开始锁定对象执行。
总结
List实现类:
1.ArrayList-->数组结构-->线程不安全,效率高-->查询快,增删慢-->容量不够扩容,当前容量长度*1.5+1; 默认长度为10,第一次扩充后的长度为16,第二次扩充后的长度为25,第三次扩从后的长度为38.5,不取用四舍五入,为38; 但是要注意,JDk1.7是1.5+1;而JDK8是1.5,所以视情况而定
2.LinkedList-->双向链表结构-->线程不安全,效率高-->查询慢,增删快-->链表直接在头部尾部新增都可以,所以没有倍数;
3.Vector-->数组结构-->线程安全,效率低-->查询快,增删慢-->扩容长度是:当前容量长度*2;