java中LinkedList源码分析
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源码分析的更多相关文章
- Java中ArrayList源码分析
一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...
- Java中HashMap源码分析
一.HashMap概述 HashMap基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.(除了不同步和允许使用null之外,HashMap类与Hashtab ...
- Java集合-LinkedList源码分析
目录 1.数据结构-链表 2.ArrayList结构特性 3.构造方法 4.成员变量 5.常用的成员方法 6.Node节点 7.序列化原理 8.迭代器 9.总结 1.数据结构-链表 链表(Linked ...
- java.util.LinkedList源码分析
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, D ...
- java中AQS源码分析
AQS内部采用CLH队列.CLH队列是由节点组成.内部的Node节点包含的状态有 static final int CANCELLED = 1; static final int SIGNAL ...
- java集合系列之LinkedList源码分析
java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...
- Java入门系列之集合LinkedList源码分析(九)
前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...
- Java集合之LinkedList源码分析
概述 LinkedLIst和ArrayLIst一样, 都实现了List接口, 但其内部的数据结构不同, LinkedList是基于链表实现的(从名字也能看出来), 随机访问效率要比ArrayList差 ...
- 【原】Spark中Client源码分析(二)
继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...
随机推荐
- 关于Win32串口
因为近段时间接触Hid相对来说多一些,由此忽略了串口中获取cbInQue这个重要的东西,下面是错误代码 // Win32SerialPortLib.cpp : 定义 DLL 应用程序的导出函数. // ...
- appium---webview(H5)元素定位
我们在做UI自动化的时候,肯定需要元素定位,那么webview(H5)的元素怎么定位呢? webview定位方法 方法一: 1.打开chrome浏览器,输入chrome://inspect 2.连接手 ...
- Java-类的生命周期浅析
简述:Java虚拟机为Java程序提供运行时环境,其中一项重要的任务就是管理类和对象的生命周期.类的生命周期.类的生命周期从类被加载.连接和初始化开始,到类被卸载结束.当类处于生命周期中时,它的二级制 ...
- AcWing 906. 区间分组
//1.将所有区间按左端点从小到大排序 //2.从前往后处理每个区间,判断能否将其放到某个现有的组中 //判断某一组的最后一个区间的右端点是否小于该区间的左端点 //如果大于或等于,就开新组,如果小于 ...
- 题解【CJOJ1371】[IOI2002]任务安排
P1371 - [IOI2002]任务安排 Description N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分 ...
- 源码安装python 报错,openssl: error while loading shared libraries: libssl.so.1.1
在执行openssl version出现如下错误: openssl: error while loading shared libraries: libssl.so.1.1: cannot open ...
- Module build failed: TypeError: this.getResolve is not a function at Object.loader sass报错!(亲测有效!~~)
vue安装node-sass编译报错 在搭建vue脚手架 或者是在vue项目中,想使用sass的功能,需先安装如下 npm install node-sass --save-dev //安装node- ...
- org.apache.httpcomponents.httpclient
apache org doc :http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e49 ...
- jquery点击添加样式,再次点击移除样式
$("#divSetting").on("click", function () { $(this).toggleClass("open") ...
- C/S编程
https://blog.csdn.net/antony1776/article/details/73717666 实现C/S程序,加上登录注册聊天等功能. 然后要做个协议的样子出来. 比如说注册功能 ...