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;
}
}

构造器:

transient int size = ;//数据个数
transient Node<E> first;//表示链表的第一个节点
transient Node<E> last;//表示链表的最后一个节点 public LinkedList() {
} public LinkedList(Collection<? extends E> c) {//用于整合Collection类型的数据
this();
addAll(c);
}

add:

 public boolean add(E e) {
linkLast(e);
return true;
} void linkLast(E e) {//采用的是尾插法
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);//新节点的前驱指向last的地址,后继为null,
                                //所以说这是一个双向链表,但不是循环的,循环的话,后继指向头节点
last = newNode;//让last指向新节点,也就说这个新节点是链表的最后一个元素
if (l == null)//当第一次添加时,first,last都是null,如果last是null,表明这是一个空链表
first = newNode;//就让新节点指向first,现在first和last都是同一个节点
else
l.next = newNode;//当在添加数据时,就让老链表的最后一个节点的后继指向新节点(那个节点本来是null的)
size++; //长度加1
modCount++;
/**
总结:
新建一个节点,让新节点的前驱指向老链表的最后一个节点
让老链表的最后一个节点的后继指向新节点
让新节点变成链表的最后一个节点
长度加1
第一个节点前驱为null,最后一个节点后继为null */
}

get:

public E get(int index) {
checkElementIndex(index);//检查一下索引是否在0到size的范围内
return node(index).item;
} Node<E> node(int index) {
// assert isElementIndex(index); if (index < (size >> )) {//看看索引的位置是在链表的前半部分还是后半部分,决定正着搜索或倒着搜索,找到后返回就行啦
Node<E> x = first;
for (int i = ; i < index; i++)//在这里看到链表是从0开始的
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - ; i > index; i--)
x = x.prev;
return x;
}
}

remove:

 public E remove(int index) {
checkElementIndex(index);//先检查一下索引
return unlink(node(index));
}
//先拿着索引找到这个节点
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;//节点的元素
final Node<E> next = x.next;//节点的后继
final Node<E> prev = x.prev;//节点的前驱 if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
} if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
} x.item = null;
size--;
modCount++;
return element;
}

LinkedList<E>源码分析的更多相关文章

  1. LinkedList 的源码分析

    LinkedList是基于双向链表数据结构来存储数据的,以下是对LinkedList  的 属性,构造器 ,add(E e),remove(index),get(Index),set(inde,e)进 ...

  2. LinkedList的源码分析

    1. LinkedList的定义  1.1  继承于AbstractSequentialList的双向链表,可以被当作堆栈.队列或双端队列进行操作 1.2  有序,非线程安全的双向链表,默认使用尾部插 ...

  3. Java的LinkedList底层源码分析

    首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能.

  4. LinkedList的源码分析(基于jdk1.8)

    1.初始化 public LinkedList() { } 并未开辟任何类似于数组一样的存储空间,那么链表是如何存储元素的呢? 2.Node类型 存储到链表中的元素会被封装为一个Node类型的结点.并 ...

  5. Java——LinkedList底层源码分析

    1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...

  6. 集合框架——LinkedList集合源码分析

    目录 示例代码 底层代码 第1步(初始化集合) 第2步(往集合中添加一个元素) 第3步(往集合中添加第二个元素) 第4步(往集合中添加第三个元素) LinkedList添加元素流程示意图 第5步(删除 ...

  7. 集合之LinkedList(含JDK1.8源码分析)

    一.前言 LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的 ...

  8. LinkedList源码分析和实例应用

    1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...

  9. [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!

    文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 前言 说真的,在 Jav ...

随机推荐

  1. <a>与文件下载-(下载一)

    <a>可直接下载xls,doc,rar,zip,exe,js文件(图片跟txt文件是直接打开的) <a href="wKioJlJolKeCIzkCADd3Wf7OPI42 ...

  2. ODBC、OLE DB、 ADO的区别

    转自:http://blog.csdn.net/yinjingjing198808/article/details/7665577 一.ODBC ODBC的由来 1992年Microsoft和Syba ...

  3. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  4. 欢迎使用 MWeb

    首先介绍一下 MWeb 是什么,MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件.MWeb 使用的是 Github Flavored Markdown 语法,在使用 MWeb 前, ...

  5. java继承覆盖与向上转型,权限

    子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...

  6. 【那些年关于java多态应用】

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...

  7. 【原创】Kafka Consumer多线程实例

    Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...

  8. html+ccs3太阳系行星运转动画

    做一个太阳系八大行星的运转动画,不包括行星的卫星,所有行星围绕太阳公转,行星采用纯色,暂时没有自转. 效果静态图: 动画中包括:太阳及各行星,运行轨道,行星公转动画. 先画好草图,设计好大小和位置,根 ...

  9. C语言计算2个数的最小公倍数

    #include<stdio.h>int main(){   int a,b,i=1,temp,lcm;   scanf("%d %d",&a,&b); ...

  10. Java传值和传址

    调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...