LinkedList简介

LinkedList基于双向链表,即FIFO(先进先出)和FILO(先进后出)都是支持的,这样它可以作为堆栈,队列使用

继承AbstractSequentialList,该类我认为和RandomAccess是一个对立,它通过次序访问数据,
实现了List,Deque,Cloneable和Serializable接口

LinkedList构造函数

  1. public LinkedList()
  2. 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源码解析的更多相关文章

  1. Java集合:LinkedList源码解析

    Java集合---LinkedList源码解析   一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...

  2. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  3. 死磕 java集合之LinkedList源码分析

    问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedL ...

  4. Java 集合之LinkedList源码分析

    1.介绍 链表是数据结构中一种很重要的数据结构,一个链表含有一个或者多个节点,每个节点处理保存自己的信息之外还需要保存上一个节点以及下一个节点的指针信息.通过链表的表头就可以访问整个链表的信息.Jav ...

  5. Java集合之LinkedList源码分析

    概述 LinkedLIst和ArrayLIst一样, 都实现了List接口, 但其内部的数据结构不同, LinkedList是基于链表实现的(从名字也能看出来), 随机访问效率要比ArrayList差 ...

  6. 【Java集合】HashSet源码解析以及HashSet与HashMap的区别

    HashSet 前言 HashSet是一个不可重复且元素无序的集合.内部使用HashMap实现. 我们可以从HashSet源码的类注释中获取到如下信息: 底层基于HashMap实现,所以迭代过程中不能 ...

  7. Java集合---Arrays类源码解析

    一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...

  8. java集合之HashMap源码解析

    Map是java中的一种数据结构,围绕着Map接口,有一系列的实现类如Hashtable.HashMap.LinkedHashMap和TreeMap.而其中HashMap和Hashtable我们平常使 ...

  9. Java集合(五)--LinkedList源码解读

    首先看一下LinkedList基本源码,基于jdk1.8 public class LinkedList<E> extends AbstractSequentialList<E> ...

随机推荐

  1. [转]mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集

    原文地址:https://www.cnblogs.com/wuyun-blog/p/5769096.html 需求: 1.直接执行前端传来的任何sql语句,parameterType="St ...

  2. ado ole方式访问access的两种方式

    OleDbConnection Connection = new OleDbConnection(); OleDbDataAdapter adapter = null; //ConnectiongSt ...

  3. mysql 通过使用联全索引优化Group by查询

    /*SELECT count(*) FROM (*/ EXPLAIN SELECT st.id,st.Stu_name,tmpgt.time,tmpgt.goutong FROM jingjie_st ...

  4. windows已阻止此软件因为无法验证发行者怎么办

    出现提示windows已阻止此软件因为无法验证发行者怎么解决?有的时候访问某些网站会出现类似的提示.导致不能正常运行某个插件,遇到这个问题一般是浏览器的安全级别设置太高了,没有允许脚本控件运行   设 ...

  5. powerdesigner 导出excel

    PD菜单栏中,依次点击 Tools ->Excute Commands->Edit/Run Script.. 填入 '*********************************** ...

  6. svn 备份脚本

    [root@hm-vpnserver-196 ~]# cat /root/svnback.sh #!/bin/bashtt=$(ls /home/svndata/) for i in $ttdo mk ...

  7. Spring Cloud Sleuth Zipkin - (2)

    在上一节<spring-cloud-sleuth+zipkin追踪服务实现(一)>中,我们使用zipkin-server.provider.consumer三个程序实现了使用http方式进 ...

  8. Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

    转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...

  9. python opencv 学习笔记

    图片缩放 image=cv2.imread('test.jpg')  res=cv2.resize(image,(32,32),interpolation=cv2.INTER_CUBIC)  cv2. ...

  10. 使用Photoshop实现雪花飘落的效果

    一.准备工作 软件环境:PhotoshopCS5 实验目的:雪花飘落的效果 二.实验步骤 1,打开素材图片并将原图层复制 2,在菜单栏内选择:滤镜->像素化->点状化,单元格大小选6  提 ...