List中的ArrayList和LinkedList源码分析(二)

简介: List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedList,还有Vector。这次我们就来看看这三个类的源码。

就和图中画的一样LinkedList是由很多个这样的节点组成的

prev是存储的上一个节点的引用。

element是存储的具体的内容。

next是存储的下一个节点的引用。

正是因为了这很多个节点,他存放着上一个和下一个节点的引用,就形成了有序的一个链表,就个铁链类似的那种,而且再加上它存的是前后两个节点的引用全部都保存起来, 所以从前往后和从后往前都能增删改查数据,所以他是个双向的链表。

我们再看看他的整体结构

LinkedList的整体结构图

28.jpg

我们从图解中也能看出点东西来,他有好多的Node,并且还有first和last这两个变量保存头部和尾部节点的信息

还有就是他不是一个循环的双向链表,因为他前后都是null,这个也是我们需要注意的地方

图解看完了,我们看看他的源码解析把。

源码分析

1.变量

29.png

构造方法

30.png

接下来我们在看看node节点

Node节点

31.png

看到这个Node节点,我们就能看出来在图中的意思了,也证明了他是个双向的链表、

添加元素


32.png33.png34.png

看完这个addAll方法之后我们再看看其他的添加元素的方法,分为了头部addFist和尾部addLast。

addFist(E e)

将e元素添加到链表并且设置其为头节点Fist

看看代码中的实现方式

35.png

详细步骤如下:

1.拿到first节点设置为f;2.新创建一个newNode设置为next节点为f节点;3.然后把newNode赋值给这个first4.如果f为空,则说明列表中没有元素,last指向newNode,否则,前first的前驱指向newNode;

这是代码的意思,我们可以通过一个图来看一下这实现:

36.png29.jpg


下面我们再看看这个addLast(E e)

就是将元素E添加到链表,并且设置为尾部的节点next;

37.png

其实过程都差不多,不仔细的去详细讲解了

我们再看看线程安全性问题,ArrayList和LinkedList都是线程不安全的,因为,他内部的方法都没有进行方法同步,或者说是加锁, 这个时候就出了一个我们不经常用的Vector,

Vector

Vector是一个可实现自动增长的数组,他也是一个线程安全的数组。 我们可以去看一下他的源码介绍:

38.png

还有很多方法我就不再一一去举例子了,而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;

相关文章
|
5月前
|
容器
List特点和遍历方式及增长因子论证和去重原理和LinkedList特点
List特点和遍历方式及增长因子论证和去重原理和LinkedList特点
27 0
|
5月前
|
C语言 C++
【C++从0到王者】第十五站:list源码分析及手把手教你写一个list(下)
【C++从0到王者】第十五站:list源码分析及手把手教你写一个list
55 0
|
5月前
|
存储 编译器 C语言
【C++从0到王者】第十五站:list源码分析及手把手教你写一个list(上)
【C++从0到王者】第十五站:list源码分析及手把手教你写一个list
51 0
|
5月前
|
安全 Java 索引
源码分析系列教程(09) - 手写List框架
源码分析系列教程(09) - 手写List框架
24 0
|
6月前
|
存储 安全 Java
一.list集合的特点与linkedlist特性的论证
一.list集合的特点与linkedlist特性的论证
31 0
|
6月前
|
XML 存储 JSON
java框架集合List子接口之ArrayList源码剖析
ArrayList使用尾删法时 , 时间复杂度为O(1) , 并且会把最后一个元素置位null , 其它删除时间复杂度为O(N) , 因为会涉及到元素的移动以及元素的遍历 ArrsyList是线程不安全的
25 0
|
6月前
|
存储 Java 索引
java集合框架List子接口之LinkedList源码剖析
LinkendList从物理结构来说是一种线性结构 , 而从逻辑结构来说是一种链式存储结构 , 虽然是线性结构 , 但是并不会按照线性的顺序存储 , 而是分散存储在内存中 , 通过指针来建立节点与节点之间的联系, 同时实现了Deque这也说明它是一个双向链表 , 在源码中 , 没有看到它对线程安全问题的处理 , 所以它同时还是一个线程不安全的链表 , 也没有看到不允许插入null元素 , 重复元素的处理 , 所以它又是一个允许重复元素以及null元素的链表
34 0
|
8月前
|
存储 Java
Java中 List集合接口及其主要的实现类ArrayList,Vector,LinkedList的详解
Java中 List集合接口及其主要的实现类ArrayList,Vector,LinkedList的详解
39 0
|
8月前
|
安全
List和ArrayList的区别
List和ArrayList的区别
45 0
|
8月前
|
Java
Java 数组(Array)与集合(List、ArrayList ...)的区别
Java 数组(Array)与集合(List、ArrayList ...)的区别
92 0