Java集合之LinkedList源码解析
LinkedList简介
LinkedList基于双向链表,即FIFO(先进先出)和FILO(先进后出)都是支持的,这样它可以作为堆栈,队列使用

继承AbstractSequentialList,该类我认为和RandomAccess是一个对立,它通过次序访问数据,
实现了List,Deque,Cloneable和Serializable接口
LinkedList构造函数
- public LinkedList()
LinkedList(Collection<? extends E> c)
可以看出和ArrayList对比是少了一个指定容量的构造函数,因为LinkedList不存在扩容的概念,
它通过判断链表的节点next属性判断是否还有下一个节点,增加删除都是针对节点prev和next属性;
结构分析

从结构图可以看出LinkedList有三个属性,size:LinkedList大小,
first:LinkedList的第一个节点,last:LinkedList最后一个节点
LinkedList源码分析(java version:1.8.0_111)
Node

链表节点Node:LinkedList内部类Node代表的就是节点信息,
item表示的是我们存储在链表当前位置的数据,next记录的是下一个节点指向,
prev记录的是上一个节点指向,这样俯视看LinkedList就会像下面图
添加元素

可以看出来,默认时候我们添加元素都是在LinkedList末尾添加元素的,
当我们添加一个元素e时候,先创建一个prev指向LinkedList最后一个节点,item为e,next指向null
的节点newNode,然后LinkedList的last就指向了newNode,
再让LinkedList原来的最后一个节点指向newNode

添加指定元素到指定位置:从代码中可以看出,首先检查当前index是否合法,
然后和LinkedList的长度比较,如果相等这是再末尾添加元素,上一个add方法类似;
如果不相等则是再LinkedList中间段添加,此时取出原来在index位置的节点,添加一个新节点,
改变对应的节点指向
这里的node(int index)方法是比较有趣的,你查看源码时候会发现这个方法好像总是在出现,
因为本质上来说,LinkedList的操作就是节点的操作,而对应的定位到某个位置的节点这个方法当然
出现的频率就是有点高了,在开始的时候知道LinkedList的几个属性,可以看出来如果我们想知道
节点信息只能从first和last属性着手,这也是node(int index)方法的由来,是从开始还是从最后
遍历这个方法做了个判断,能加快一定的遍历速度
LinkedList遍历
1.迭代器遍历

2.ForEach遍历
for (Object s : list)
3.随机访问遍历
for (int i =0; i<list.size();i++){
list.get(i);
}
4.pollFirst()/pollLast()/removeFirst()/removeLast()方法
while (list.pollFirst() != null){
}
总结
对应的LinkedList的增删改查操作都是对节点的prev,next和item的操作,遍历测试可以发现
使用随机访问遍历时候速度是最慢的,因为在每一次list.get(index)时候都从开始或者最后遍历
一次链表[查看源码可以看见get方法也是需要上面的node(index)方法],而foreach和迭代器
速度差不多
Java集合之LinkedList源码解析的更多相关文章
- Java集合:LinkedList源码解析
Java集合---LinkedList源码解析 一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...
- Java集合---Array类源码解析
Java集合---Array类源码解析 ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...
- 死磕 java集合之LinkedList源码分析
问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedL ...
- Java 集合之LinkedList源码分析
1.介绍 链表是数据结构中一种很重要的数据结构,一个链表含有一个或者多个节点,每个节点处理保存自己的信息之外还需要保存上一个节点以及下一个节点的指针信息.通过链表的表头就可以访问整个链表的信息.Jav ...
- Java集合之LinkedList源码分析
概述 LinkedLIst和ArrayLIst一样, 都实现了List接口, 但其内部的数据结构不同, LinkedList是基于链表实现的(从名字也能看出来), 随机访问效率要比ArrayList差 ...
- 【Java集合】HashSet源码解析以及HashSet与HashMap的区别
HashSet 前言 HashSet是一个不可重复且元素无序的集合.内部使用HashMap实现. 我们可以从HashSet源码的类注释中获取到如下信息: 底层基于HashMap实现,所以迭代过程中不能 ...
- Java集合---Arrays类源码解析
一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...
- java集合之HashMap源码解析
Map是java中的一种数据结构,围绕着Map接口,有一系列的实现类如Hashtable.HashMap.LinkedHashMap和TreeMap.而其中HashMap和Hashtable我们平常使 ...
- Java集合(五)--LinkedList源码解读
首先看一下LinkedList基本源码,基于jdk1.8 public class LinkedList<E> extends AbstractSequentialList<E> ...
随机推荐
- 了解PHP中$_SERVER变量对路径的解析
1,$_SERVER["QUERY_STRING"]说明:查询(query)的字符串 2,$_SERVER["REQUEST_URI"]说明:访问此页面所需的U ...
- Map 与 JavaBean 的相互装换
目的 为了方便使用 DbUtils,在插入数据时需要传入含有占位符的 SQL 语句和对应占位符的值(数组),封装代码如下: /** * 插入实体 */ public static <T> ...
- C语言 · 集合运算
算法训练 集合运算 时间限制:1.0s 内存限制:512.0MB 问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的 ...
- 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别
Mutex与Event控制互斥事件的使用详解 最近写一程序,误用了Mutex的功能,错把Mutex当Event用了. [Mutex] 使用Mutex的主要函数:CreateMutex.ReleaseM ...
- Java图形界面设计——substance皮肤
http://jianweili007-163-com.iteye.com/blog/1141358 ————————————————————————————————————————————————— ...
- 安卓程序代写 网上程序代写[原]Android开发技巧--Application
1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Application构造方法 : App ...
- 【转】如果有人让你推荐Python技术书,请让他看这个列表
入门级 <Head First Python>+ 入门级 + 微信49票 + 豆瓣评分 9.5 推荐语: 66:浅显易懂,编排的顺序特别,有大量插图.对话,不感觉枯燥 古心:通熟易懂,配有 ...
- C++ operator关键字详解
C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换. 类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转 ...
- 如何配置propagation
配置spring事务代理时的事务属性. <prop key=“get*”>PROPAGATION_REQUIRED,readOnly</prop> 表示类方法名称是以get开头 ...
- Linux强制杀进程命令行工具
需求, 有时候我们会有手动启动程序, 但是又在后台, 没有像服务那样有start, 和stop的程序, 这时候需要用强制杀进程方式 涉及工具, awk, sed, xargs, kill 需求一: 已 ...
