基于JDK1.8.0_191

介绍

  LinkedList是以节点来保存数据的,不像数组在创建的时候需要申请一段连续的空间,LinkedList里的数据是可以存放在不同的空间当中,然后以内存地址作为寻找的工具,比如第一个节点里保存了第二个节点的地址信息,第二个节点又保存了第三个节点的地址信息,以此类推

节点Node的代码如下

    private static class Node<E> {
//节点数据
E item;
//下一个节点
Node<E> next;
//上一个节点
Node<E> prev; Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

LinkedList有以下特性

  • 是双向链表,每个节点保存着下一个节点的信息,也保存了上一个节点的信息
  • 不是线程安全的,线程安全可以通过
List list = Collections.synchronizedList(new LinkedList(...));

实现

  • LinkedList可以作为堆栈和队列使用,它包含了许多对应的方法,比如poll、push等等

构造函数

  LinkedList的构造函数比较简单,它不需要初始化大小,因为它不存在扩容的要求

  • public LinkedList();

    第一个是无参构造函数,方法体里什么都不做

  • public LinkedList(Collection<? extends E> c);

    第二个是带初始化数据的,也就是创建一个带有c数据的LinkedList,c数据通过LinkedList的addAll方法插入

部分源码解析

点击查看详细内容

//在末尾插入节点,主要通过linkLast()实现
public boolean add(E e);
/**
* 在末尾插入节点
*/
void linkLast(E e) {
//LinkedList专门有last对象,用来保存最后一个节点信息
final Node l = last;
//创建新的节点
final Node newNode = new Node(l, e, null);
last = newNode;
//如果之前LinkedList是null的,那新插入的就是第一个节点
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
//在指定位置插入节点
public void add(int index, E element) {
checkPositionIndex(index);
//如果指定位置是最后,调用linkLast方法
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
} //在指定节点前面插入节点,下面代码的逻辑就是改变插入位置前一个节点,当前要插入的节点和后一个节点的prev和next的指向
void linkBefore(E e, Node<E> succ) {
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.next = newNode;
size++;
modCount++;
} //在指定位置插入集合
public boolean addAll(int index, Collection<? extends E> c) {
checkPositionIndex(index);
//转为数组
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
//要插入位置的前一个节点和后一个节点
Node<E> pred, succ;
if (index == size) {
succ = null;
pred = last;
} else {
succ = node(index);
pred = succ.prev;
}
//循环插入节点
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
//处理要插入位置的后一个节点
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
} size += numNew;
modCount++;
return true;
} //循环遍历LinkedList,然后把所有数据设为NULL
public void clear(); //循环遍历LinkedList,然后做==或者equals操作
public int indexOf(Object o);

LinkedListList的查询

  LinkedList是不建议做频繁的查询操作,那么如果需要查询,哪种更快呢,我们可以试一下

  • 第一种
  for(int i = 0; i < list.size; i++){
list.get(i);
}

这种是最差的方式,完全不用测试,因为在for循环里,get操作又是通过另一个for循环实现的,所以这个操作等于是for循环的嵌套

  • 第二种
for(String str : list){}

在1千万数据时,耗时150ms

  • 第三种
for(Iterator<String> iter = list.iterator(); iter.hasNext();iter.next();){}

同样的数据耗时165ms,和第二种差不多

我们通过查看编译后的代码可以知道,第二种编译后的代码是

for(Iterator var4 = list.iterator(); var4.hasNext(); var5 = (String)var4.next()) {}

其实也就是通过迭代的方式

而第三种是

Iterator iter = list.iterator();
while(iter.hasNext()) {iter.next();}

通过while循环操作

本质上第二种和第三种差不多,只要不使用第一种就行

Java源码-集合-LinkedList的更多相关文章

  1. 浅析Java源码之LinkedList

    可以骂人吗???辛辛苦苦写了2个多小时搞到凌晨2点,点击保存草稿退回到了登录页面???登录成功草稿没了???喵喵喵???智障!!气! 很厉害,隔了30分钟,我的登录又失效了,草稿再次回滚,不客气了,* ...

  2. 【数据结构】7.java源码关于LinkedList

    关于LinkedList的源码关注点 1.从底层数据结构,扩容策略2.LinkedList的增删改查3.特殊处理重点关注4.遍历的速度,随机访问和iterator访问效率对比 1.从底层数据结构,扩容 ...

  3. Java源码-集合-ArrayList

    基于JDK1.8.0_191 介绍   在Java中,对于数据的保存和使用有多种方式,主要的目的是以更少的资源消耗解决更多的问题,数组就是其中的一种,它的特点是所有的数据都保存在内存的一段连续空间中, ...

  4. jdk源码->集合->LinkedList

    类的属性 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E&g ...

  5. java源码阅读LinkedList

    1类签名与注释 public class LinkedList<E> extends AbstractSequentialList<E> implements List< ...

  6. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  7. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  8. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  9. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

随机推荐

  1. JEECG屏蔽在线聊天插件

    如图所示: 找到pom.xml文件将如下代码屏蔽即可: <!-- 在线聊天工具 --> <dependency> <groupId>org.p3framework& ...

  2. SQL语句 分组 多行合并成一行

    ,,'')) FROM Table d GROUP by Id 另外: sql 单引号转义:两个单引号转义为一个单引号 set @sql='STUFF((SELECT '','' + Names FR ...

  3. Python学习之Craps赌博游戏篇

    在此先安利一波大佬的Python学习项目地址:https://github.com/jackfrued/Python-100-Days 这些天一直在看着大佬的项目学习Python,这是第五天循环学习完 ...

  4. 本次我们使用idea构建springmvc项目

    该案例的github地址:https://github.com/zhouyanger/demo/tree/master/springmvcdemo1 1.首先我们可以创建maven项目,file-&g ...

  5. Springmvc-crud-07(springmvc标签错误)

    错误:springmvc标签错误 原因:1.在springmvc中的form标签中没有绑定modelAttribute属性 2.必须要获取到参数(可以创建map对象,进行存储参数,再用modelAtt ...

  6. 进程池与线程池、协程、协程实现TCP服务端并发、IO模型

    进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...

  7. sping中AOP

    委托代理的概念: 委托类对象就是我们后面说到的"目标对象", 也就是需要[被]代理的对象 target代理类对象就是我们后面说到的"代理对象",目标对象就是需要 ...

  8. 【原】python-jenkins信息

    1.官方文档: https://python-jenkins.readthedocs.io/en/latest/examples.html#example-1-get-version-of-jenki ...

  9. 使用MQTTBox连接阿里云平台

    这篇只做一个简单的介绍,和上一篇没有根本的区别.只是就两个客户端的差异介绍一下. 一.需要参考的内容: 使用MQTT.fx连接阿里云平台: https://www.cnblogs.com/mhtc/p ...

  10. Vue-footer始终置底

    需求:当页面高度不足一屏时需要footer固定显示在页面底部,而页面内容超过一屏时需要footer紧跟在页面内容的最后. 思路:通过获取 网页可见区域高度:document.body.clientHe ...