本文基于jdk1.8_171

LinkedList介绍

之前看了ArrayList,内部是一个数组。这次看了LinkedList,作用和ArrayList一样,但是内部是链表形式。链表结构如下图:

数组和链表的区别

直接看例子:

数组: 假设有10个人去看电影,想要挨着坐,那就需要找同一排连续的10个位置坐(座位号01-10)。如果想要找5号先生,那直接去第五个座位即可。但是,如果此时来了第十一个人,想要坐在4号和5号先生的位置中间,那么原本5号先生和后面的所有人都要往后挪个位置,然后11号先生才能落座。

链表: 还是10个人去看电影,不用挨着坐,每个人记着自己前一个人和后一个人坐哪里就行,第一个人记下一个人和最后一个人记上一个人。此时还是来了第十一个人,想要坐在4号和5号先生的位置中间(不是空间意义的中间),那么5号先生更换自己上家为11号,4号先生更换下家为11号,11号记自己上家是4号,下家是5号即可。但是如果需要找到5号的位置,那你需要先找1号,问他下家2号在哪里,然后找2号下家3号。。。一直找到5号。

所以结论:数组查找元素比链表快,但往中间插入元素链表比数组快。

内部类

/**
* 链表内部元素
*/
class Node<E>{
//当前元素
E item;
//上一个元素
Node<E> prev;
//下一个元素
Node<E> next;
Node(Node<E> prev,E element,Node<E> next){
this.item = element;
this.next = next;
this.prev = prev;
}
}

成员变量

//元素个数
transient int size = 0;
//链表第一个元素
transient Node<E> first;
//链表最后一个元素
transient Node<E> last;

常用方法

1、addFirst(E e)

public void addFirst(E e){
linkFirst(e);
} private void linkFirst(E e){
//缓存第一个元素
final Node<E> f = first;
//新建元素
final Node<E> newNode = new Node<>(null, e, f);
//第一个元素设置为新元素
first = newNode;
if(f == null)
//如果链表原先是空的,那添加元素后最后一个元素也是新元素
last = newNode();
else
//如果链表原先不为空,那么原先第一个元素的前一位指向新元素
f.prev = newNode;
//链表元素个数加一
size++;
//集合修改次数加一
modCount++;
}

addLast类似,不赘述。

2、add(E e)

public boolean add(E e){
//add方法就是在链表末尾添加元素
linkLast(e);
return true;
}

3、add(int index,E element)

public void add(int index,E element){
//这一步就是检查index是否越界,越界就抛出异常
checkElementIndex(index);
//如果index是size,就加在链表最后,否则就加在指定元素之前
if(index == size)
linkLast(element);
else
//node(index)方法解析往下看
linkBefore(element,node(index));
} void linkBefore(E e,Node<E> succ){
//assert succ !=null
//缓存指定元素的前一个元素
final Node<E> pred = succ.prev;
//要插入的新元素
final Node<E> newNode = new Node<>(pred, e, succ);
//指定元素的前一位变成新元素
succ.prev = newNode;
if(pred == null){
//如果指定元素是第一个,那么新元素就变成第一个元素
first = newNode;
} else {
//缓存的pred的下一个元素变成新元素
pred.next = newNode;
}
size++;
modCount++;
}

4、get(int index)

public E get(int index){
checkElementIndex(index);
//node(index)方法解析往下看
return node(index).item;
} Node<E> node(int index){
if(index < (size >> 1)){
//如果index小于size的一半,则从头开始找
//先找到第一个元素
Node<E> x = first;
//往后找index次,我看的时候第一次没理解,举了例才明白,比如index=1,size=4等等
for(int i=0; i < index; i++)
x = x.next;
return x;
} else {
//从尾开始找
//先找到最后一个元素
Node<E> x = last;
//往前找index次
for(int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}

结语

LinkedList有自身的优点,虽然实际运用不如ArrayList频繁,但我们依然要了解它的特性以及实现方式。

jdk源码--LinkedList的更多相关文章

  1. JDK源码分析(三)—— LinkedList

    参考文档 JDK源码分析(4)之 LinkedList 相关

  2. JDK源码分析(2)LinkedList

    JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...

  3. JDK源码学习LinkedList

    LinkedList是List接口的子类,它底层数据结构是双向循环链表.LinkedList还实现了Deque接口(double-end-queue双端队列,线性collection,支持在两端插入和 ...

  4. 一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要

    一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.什么 ...

  5. JDK源码学习系列05----LinkedList

                                             JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...

  6. 【java基础之jdk源码】集合类

    最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...

  7. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  8. JDK源码阅读顺序

      很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Obj ...

  9. 一点一点看JDK源码(〇)

    一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...

随机推荐

  1. WPF 打印不显示的元素

    <Window x:Class="_097打印不显示的元素.MainWindow"        xmlns="http://schemas.microsoft.c ...

  2. linux服务脚本编写

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. qmake.exe是在Qt安装编译时生成的,里面内嵌了Qt相关的一些路径(最简单的方法是保持一样的安装路径,最方便的办法是设置qt.conf文件)

    在网上直接下载别人编译好的Qt库,为自己使用省了不少事.但往往也会遇到些问题,其中Qt version is not properly installed,please run make instal ...

  4. iOS中的加密操作

    最近项目中用到了一些加密操作,在这里简单总结了一下.总的来说加密分为对称加密和非对称加密两种,下面对这两种加密方式作一个简单的说明. 对称加密(Symmetric Cryptography) 对称加密 ...

  5. Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good

    版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 以下是<共同成长社区>第 58 次 ...

  6. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  7. C# Task 的用法

    C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...

  8. 深度强化学习day01初探强化学习

    深度强化学习 基本概念 强化学习 强化学习(Reinforcement Learning)是机器学习的一个重要的分支,主要用来解决连续决策的问题.强化学习可以在复杂的.不确定的环境中学习如何实现我们设 ...

  9. 反向代理在APP通过无线路由接入3G/4G时的特殊作用

    由于某些需求,要临时搭建局域网络,给小范围内大量移动客户端提供特定的网络服务,这样的服务通常包含常见的HTTP服务.数据文件下载服务.RESTFul接口服务等.市面常见的非企业级WIFI路由器能够承受 ...

  10. IIS7上传4M文件以上文件出现“Post大小超出允许的限制”错误解决方法

    在web.config文件中的system.web节点中添加如下这句,即40M <system.web> <httpRuntime maxRequestLength = " ...