LinkedList源码(add方法)
对于要有扎实的java基础,集合是必须掌握的,而且精读这部分的源码很有用,也很有必要。而LinkedList是在java.util包下,和java.io,java.lang都是比较常用,而且比较简单。看看它们的源码有助于锻炼我们看源码的感觉,也了解一下大神们写代码的风格。看这些源码的目的,更多是为了增加阅读代码能力。
这里只写LinkedList的初始化和add()方法的源码分析,先放一张Collection集合的分类简图: 
LinkedList采用双向链表存储方式

缺点:遍历和随机访问元素效率低下。
优点:插入,删除元素效率比较高(但是前提也是必须先低效率查询才可,如果插入删除发生在头尾可以减少查询次数)。
那开始吧!
public class TestLinkedList {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
}
}
点进LinkedList发现只是一个构造函数,有3个变量(这里只放部分代码)
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0; //默认长度0
transient Node<E> first; //上一个元素
transient Node<E> last; //下一个元素 public LinkedList() {
} 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;
}
} }
Node是LinkedList的一个内部类,Node指的是双向链表的结点(包括3部分,中间数据item,左右两边的指针,指向前prev后next的结点)
执行到LinkedList<Integer> list = new LinkedList<Integer>();在内存中是这样的

我们再看看add()方法
public boolean add(E e) {
linkLast(e);
return true;
}
/**
* Links e as last element.//将e链接为最后一个元素
*/
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
执行add(1)方法后,将开始last=null赋给了一个变量l,这时候new Node<>(l, e, null);就是new Node<>(null, 1, null),在栈里创建了对象(Node结点)。

到了12行last = newNode;last就不是null了,是0x2012,也就指向了下一个结点

在往后面看if判断,这是l是等于null的,就把first = newNode;first就不是null了,是0x2012(newCode),也就指向了上一个结点。因为只有一个结点,前后都是它自己。

继续add,l=0x2012,所以new Node<>(l, e, null);就是new Node<>(0x2012, 2, null),所以新增的结点就指向了上一个0x2012。

然后再last=newNode,就是0x3012。它就不执行0x2012了。

这个时候if判断,l已经不等空了,执行l.next=newNode。newNode是0x3012,l是0x2012,l.next就是0x2012这个结点的next属性,也是个Node。

内存图是这样的:

最后再add

LinkedList源码(add方法)的更多相关文章
- 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析
LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明. 1.链表的概念 链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链 ...
- LinkedList源码解析
LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.1.链表的概念链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表又分为单向链表和 ...
- ArrayList和LinkedList源码
1 ArrayList 1.1 父类 java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.Abstract ...
- 转:【Java集合源码剖析】LinkedList源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253 您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- LinkedList源码和并发问题分析
1.LinkedList源码分析 LinkedList的是基于链表实现的java集合类,通过index插入到指定位置的时候使用LinkedList效率要比ArrayList高,以下源码分析是基于JDK ...
- ArrayList 和 LinkedList 源码分析
List 表示的就是线性表,是具有相同特性的数据元素的有限序列.它主要有两种存储结构,顺序存储和链式存储,分别对应着 ArrayList 和 LinkedList 的实现,接下来以 jdk7 代码为例 ...
- Android版数据结构与算法(三):基于链表的实现LinkedList源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. LinkedList 是一个双向链表.它可以被当作堆栈.队列或双端队列进行操作.LinkedList相对于ArrayList来说,添加,删除元素效 ...
- LinkedList源码分析和实例应用
1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...
- Java集合:LinkedList源码解析
Java集合---LinkedList源码解析 一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...
随机推荐
- 作业九——DFA最小化,语法分析初步
- Java创建对象时的简单内存分析
简单创建对象的内存分析 主程序: 1 public class Application { 2 public static void main(String[] args) { 3 Animal do ...
- 抖音人脸识别Autojs脚本
title: 抖音人脸识别Autojs脚本 用Autojs写的抖音人脸颜值检测脚本 疫情期间宅家久了,昨天闲着没事(好吧,有事情,但是我不想做) ,消费之火熊熊燃烧.一咬牙把Autojs入正了.我 ...
- Libra教程之:执行Transactions
文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...
- JAVA 之 JSTL
一.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- from _sqlite3 import * ImportError: DLL load failed: 找不到指定的模块。
*Error creating Django application: Error on python side. Exit code: 1, err: Traceback (most recent ...
- CentOS配置Tomcat监听80端口,虚拟主机
2019独角兽企业重金招聘Python工程师标准>>> Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [ro ...
- Xapian实战(一):环境搭建 + 简介
1. 参考资料 http://xapian.org/docs/install.html Xapian的存储系统.性能以及检索模型等 2. 安装 1) xapian # ./configure --pr ...
- 数学--数论---P4718 Pollard-Rho算法 大数分解
P4718 [模板]Pollard-Rho算法 题目描述 MillerRabin算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的.Pollar ...
- P1522 牛的旅行 Cow Tours(floyd)
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...