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. 11月Android笔记

    不知不觉又过了两个月了,过的够呛.新收获:百度云,视频直播,sqlite加密,lucene,SlidingPaneLayout. 我发现只要你有心,你期望的事情会接踵而来(不包括爱情= =) 上个游戏 ...

  2. Mac OS X下的移动光标和文字编辑快捷键

    移动光标快捷键 Control-F 光标前进一个字符,相当于右键(F = Forward) Control-B 光标后退一个字符,相当于左键(B = Backward) Control-P 上移一行, ...

  3. 【微信小程序】使用setTimeout制作定时器的思路

    setTimeout(func, time)可以使得每隔time毫秒就执行一次func函数,常用来做计时器/时钟. 下面是在微信小程序中的使用思路,只截取了关键部分代码. var timer; // ...

  4. Android——用Activity和Service实现简单的音乐播放器

    一.只用Activity 容易出现问题 xml <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  5. 很简洁的分页控件 适合MVC

    <!DOCTYPE html> <html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml" ...

  6. js 空数组是true还是false

    var arr = new Array(); // 或 var arr = []; 我们知道,初始化后,即使数组arr中没有元素,也是一个object. typeof arr; // "ob ...

  7. Python __init__函数的使用

    class Cat: def __init__(self,_name): self.name = _name def eat(self): print("i am eating ." ...

  8. Css格式化/压缩(代码)

    function $() { var elements = new Array(); for (var i = 0; i < arguments.length; i++) { var eleme ...

  9. SAP Actual Costing with Material Ledger 激活实际成本后台配置

    Actual Costing with Material Ledger 1      Purpose This configuration guide provides the information ...

  10. 【转】【WPF】WPF为stackpanel设置滚动条

    <ScrollViewer x:Name="scrolls" VerticalScrollBarVisibility="Auto" HorizontalS ...