List集合-02.LinkedList
2.LinkedList
2.1 UML继承关系图

2.2 底层存储节点
- 通过内部类Node存储,可以看出是双向的链表结构
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;
        }
    }
- add方法是在最后一个node节点增加关联
 可以看出LinkedList是开链表,首尾不相连,不会形成闭环
transient Node<E> last;
 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++;
    }
- get,remove方法
 对list长度除以2,判断是前部分还是后部分,再进行,循环取值;
 Node<E> node(int index) {
        // assert isElementIndex(index);
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }
2.3 ListIterator迭代器
- 可以指定开始迭代位置
 ListItr(int index) {
            // assert isPositionIndex(index);
            next = (index == size) ? null : node(index);
            nextIndex = index;
        }
- remove,set方法前必须要用next()方法,将当前节点缓存到lastReturned
private Node<E> lastReturned;//用于存储切换的node节点
- add 方法根据节点位置,进行判断在节点之前增加,还是节点之后增加
 lastReturned = null;
  if (next == null)
      linkLast(e);
  else
      linkBefore(e, next);
2.3 常用增删方法实现
- poll,poll,removeFirst 方法,从头部取出数据,并从list中移除该节点
 private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }
-push 方法是从头部增加节点数据
2.4 LinkedList 内部提供了切分的方法
 LLSpliterator<E> implements Spliterator<E>
总结一下:
1.LinkedList的存储时通过Node对象存储的,Node对象有pre,next双向链关联前后Node;FirstNode的pre为空,LastNode的next为空,不能形成闭合的链表;
2.迭代器在移除Node之前,必须使用node方法,缓存当前节点信息否则会报错;
3.LinkedList提供了pop,pull等方法,从头部获取并移除Node
List集合-02.LinkedList的更多相关文章
- 【Java集合】LinkedList详解前篇
		[Java集合]LinkedList详解前篇 一.背景 最近在看一本<Redis深度历险>的书籍,书中第二节讲了Redis的5种数据结构,其中看到redis的list结构时,作者提到red ... 
- JDK集合框架--LinkedList
		上一篇讲了ArrayList,它有一个"孪生兄弟"--LinkedList,这两个集合类总是经常会被拿来比较,今天就分析一下LinkedList,然后总结一下这俩集合类的不同 首先 ... 
- Java自学-集合框架 LinkedList
		Java集合框架 LinkedList 序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 示例 1 : LinkedList ... 
- day19--Java集合02
		Java集合02 6.ArrayList ArrayList的注意事项: Permits all element , including null ,ArrayList 可以加入null ,并且可以加 ... 
- 集合框架——LinkedList集合源码分析
		目录 示例代码 底层代码 第1步(初始化集合) 第2步(往集合中添加一个元素) 第3步(往集合中添加第二个元素) 第4步(往集合中添加第三个元素) LinkedList添加元素流程示意图 第5步(删除 ... 
- Java8集合框架——LinkedList源码分析
		java.util.LinkedList 本文的主要目录结构: 一.LinkedList的特点及与ArrayList的比较 二.LinkedList的内部实现 三.LinkedList添加元素 四.L ... 
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
		概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ... 
- IT第二十一天 - Collections、ArrayList集合、LinkedList集合、Set集合、HashMap集合、集合的操作注意【修20130828】
		NIIT第二十一天 上午 集合 1. 集合Collection存储数据的形式是单个存储的,而Map存储是按照键值对来存储的,键值对:即键+值同时存储的,类似align="center&quo ... 
- Java 集合之LinkedList源码分析
		1.介绍 链表是数据结构中一种很重要的数据结构,一个链表含有一个或者多个节点,每个节点处理保存自己的信息之外还需要保存上一个节点以及下一个节点的指针信息.通过链表的表头就可以访问整个链表的信息.Jav ... 
随机推荐
- Android9.0配置charles的https抓包
			问题: 按照charles的正常流程去安装证书后,然后使用手机(一加5T,安卓9.0)访问https站点发现有些CONNECT请求无法查看,但是其它类型都支持https 解决方案: 前提条件:手机已经 ... 
- 【大厂面试04期】讲讲一条MySQL更新语句是怎么执行的?
			流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ... 
- 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程
			书接上文 上篇文章「MySQL 可重复读,差点就让我背上了一个 P0 事故!」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下. 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么 ... 
- STM32的ADC采样时间
			STM32的ADC采样时间与其ADC的时钟频率密不可分. 例:STM32F103系列的ADC的时钟是在APB2(最大72MHZ)上.我们可以对其分频: RCC_PCLK2_Div2: ADC cloc ... 
- SQL Msg 18054, Level 16, State 1
			今天接到一个看起来很简单的任务--修改数据库中的一项数据.听起来很简单吧. 在网上搜索了一下,很快就拼凑出了相应的 SQL 语句: UPDATE [suivi].[dbo].[numSerie]SET ... 
- Python函数&异常处理
			1. 函数基础 1.1 参数和返回值 1.1.1 参数 位置参数.关键字参数 def my_func1(x, y, z): print(x+y+z, "计算结束") my_func ... 
- LR字符串处理函数-lr_save_int
			int lr_save_int(int value,const char * param_name); value:要分配给参数的整数值. param_name:参数的名称. lr_save_in ... 
- Probius:一个功能强大的自定义任务系统
			断更的这些日子,我又折腾了一个轮子,文末参考源码 大约在一年半以前写过一篇文章『探秘varian:优雅的发布部署程序』,里边有讲到我们采用类似lego的模块化方式来构建CICD的流程,虽能满足我们的需 ... 
- input属性设置type="number"之后, 仍可输入e;input限制只输入数字
			只需在行内输入 onKeyUp="this.value=this.value.replace(/[^\.\d]/g,'');" 就解决了 <input typ ... 
- RedHat服务器安装
			为什么选择 RedHat 市场占有率商业化比较高 厂商的支持比较丰富 新手建议ubuntu 进行上手 等熟悉了Linux环境可以选择自己喜欢的发行版 (有些Geeker就是认为Ubuntu太易于使用了 ... 
