LinkedList<E>源码分析
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>源码分析的更多相关文章
- LinkedList 的源码分析
LinkedList是基于双向链表数据结构来存储数据的,以下是对LinkedList 的 属性,构造器 ,add(E e),remove(index),get(Index),set(inde,e)进 ...
- LinkedList的源码分析
1. LinkedList的定义 1.1 继承于AbstractSequentialList的双向链表,可以被当作堆栈.队列或双端队列进行操作 1.2 有序,非线程安全的双向链表,默认使用尾部插 ...
- Java的LinkedList底层源码分析
首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能.
- LinkedList的源码分析(基于jdk1.8)
1.初始化 public LinkedList() { } 并未开辟任何类似于数组一样的存储空间,那么链表是如何存储元素的呢? 2.Node类型 存储到链表中的元素会被封装为一个Node类型的结点.并 ...
- Java——LinkedList底层源码分析
1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...
- 集合框架——LinkedList集合源码分析
目录 示例代码 底层代码 第1步(初始化集合) 第2步(往集合中添加一个元素) 第3步(往集合中添加第二个元素) 第4步(往集合中添加第三个元素) LinkedList添加元素流程示意图 第5步(删除 ...
- 集合之LinkedList(含JDK1.8源码分析)
一.前言 LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的 ...
- LinkedList源码分析和实例应用
1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...
- [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 前言 说真的,在 Jav ...
随机推荐
- sql无限递归查询
--------------所有子集数据包括自己--------------------- CREATE PROCEDURE ALLSON @ID INT AS BEGIN WITH CTE AS ( ...
- 深入理解Sqlserver文件存储之页和应用 (转)
我们每天都在使用数据库,我们部门使用最多的关系数据库有Sqlserver,Oracle,有没有想过这些数据库是怎么存放到操作系统的文件中的?有时候为了能够设计出最优的表结构,写出高性能的Sqlserv ...
- OCP考点实战演练02-日常维护篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练02-日常维护篇 1.数据库体系结构和AS ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 【知识积累】try-catch-finally+return总结
一.前言 对于找Java相关工作的读者而言,在笔试中肯定免不了遇到try-catch-finally + return的题型,需要面试这清楚返回值,这也是这篇博文产生的由来.本文将从字节码层面来解释为 ...
- linux内核数据结构之kfifo
1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...
- WPF入门:XAML
XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...
- C#中HttpClient使用注意:预热与长连接
最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...
- C# Linq排序
今天在家看了一下linq,实践了一下书中代码,发现排序和查重的先后顺序太重要了. using System; using System.Collections.Generic; using Syste ...
- Android Service
一.在MainAcitivity界面启动Service : public class MyService extends Service intent = new Intent(MainActivi ...