ArrayList是动态数组,其实本质就是对数组的操作。
那么LinkedList实现原理和ArrayList是完全不一样的。
现在就来分析一下ArrayList和LinkeList的优劣吧
LinkedList是一个双向链表,每个元素都是一个Node对象,
这个node对象里面有三个成员:
E item;指向实际的元素
Node<E> next;指向下一个节点
Node<E> prev;指向前一个结点

利用idea编辑器查看LinkedList的结构,发现只有三个成员变量。

而所有的public方法操作的都是这个三个变量。
下面逐个分析方法。

主要就是调用了linkLast方法。

步骤如下:
第一步:l指向尾节点,
第二步:创建新的节点newNode;因为是在链表的最后添加元素,所以新节点的next元素为null.
第三步:尾节点指向新的节点
第四步:如果l(之前的尾节点)为空,新节点当作第一个节点
第五步:如果l(之前的尾节点)不为空,则之前的尾节点的next变量指向新节点。
链表大小size++;
修改的次数modCount++;

List<String> list=new LinkedList<>();
list.add("a");
list.add("b");

与ArrayList不同,LinkedList内存是按需分配的,不需要提前分配内存空间,因为操作的不是数组。

get方法

checkElementIndex(index);主要用于检查参数是否符合规范,没什么好说的。

主要看node(index)方法。

index<(size>>1)表示index小于size/2;
如果index索引位于前半部分,从头开始根据next向后遍历;
一直找到index-1索引处
如果在后半部分从last处开始根据prev向前遍历。一直循环到index处。
ArrayList中数组是连续存放的,可以根据索引直接定位元素,而LinkedList中,必须从头或尾顺着链接查找,所以论查询效率LinkedList没有ArrayList效率高;但是在链表前或尾添加和删除的效率倒是比ArrayList要高。

LinkedList还提供了remove,add(int index,E element),indexOf(Object o)等等这些方法,基本上都是差不多的原理操作的。

java中LinkedList源码分析的更多相关文章

  1. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  2. Java中HashMap源码分析

    一.HashMap概述 HashMap基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.(除了不同步和允许使用null之外,HashMap类与Hashtab ...

  3. Java集合-LinkedList源码分析

    目录 1.数据结构-链表 2.ArrayList结构特性 3.构造方法 4.成员变量 5.常用的成员方法 6.Node节点 7.序列化原理 8.迭代器 9.总结 1.数据结构-链表 链表(Linked ...

  4. java.util.LinkedList源码分析

    public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, D ...

  5. java中AQS源码分析

    AQS内部采用CLH队列.CLH队列是由节点组成.内部的Node节点包含的状态有 static final int CANCELLED =  1; static final int SIGNAL    ...

  6. java集合系列之LinkedList源码分析

    java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...

  7. Java入门系列之集合LinkedList源码分析(九)

    前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...

  8. Java集合之LinkedList源码分析

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

  9. 【原】Spark中Client源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...

随机推荐

  1. java-日期取特定值

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author G ...

  2. Charles 查看https请求数据 Mac/ android

    Charles_v4.0.1_Mac_破解版下载地址:https://pan.baidu.com/s/1c23VPuS 1.在Mac电脑上安装Charles的根证书 打开Charles->菜单H ...

  3. (复习)父子组件传值使用v-modal双向绑定,报错Avoid mutating a prop directly解决方案

    报错:Avoid mutating a prop directly since the value will be overwritten whenever the parent component. ...

  4. python之路之反射

    这个是上两个的加强版

  5. Scale9Sprite 的 setCapInsets中需要注意的地方

    在设置 setCapInsets()方法的y参数的时候,不直接取cocosStudio中的y,而是取Scale9Sprite.height - cocosStudio中的y.

  6. Java爬虫学习(2)之用对象保存文件demo(1)

    package com.mieba.spider; import java.util.ArrayList; import java.util.List; import java.util.Vector ...

  7. [Netcat] 断线重连 自动重连

    今天想做些操作,所以想到了nc 但是nc太过于轻量级 所以 导致我没有找到他的断线重连功能 然后我就想到了windows的神器之一 vbs脚本 vbs代码如下 Dim a,b set a= WScri ...

  8. 2019-2020-2 20174314王方正 《网络对抗》 Exp0 Kali安装

    本博旨记录安装Kali的具体步骤. 一.Vmware的安装 略. 二.Vmware的配置 选择[文件]-[新建虚拟机]. 出现新建虚拟机导向,按照以下图示配置每一步.

  9. python map、join函数

    map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. map(fun ...

  10. [lua]紫猫lua教程-命令宝典-L1-01-06. 循环结构

    L1[循环]01. for循环结构介绍 只是简单的说了下计数型的for循环结构 for i=1,10,1 do testlib.traceprint(i) end 注意几点: 1.上面的1和10表示循 ...