LinkedList底层链表结构
LinkedList底层链表结构
- 前言概述
- 核心代码
- 效果展示
第一章 前言概述
第01节 简述说明
LinkedList 底层
LinkedList 底层采用的是 双向链表完成,特点是 增删快,查询慢。
LinkedList 体系
第02节 特有方法
说明
在 LinkedList 当中,包含有大量的操作头和尾的方法。
例如:1. 添加头、添加尾2. 删除头、删除尾3. 查询头、查询尾
方法
【1】添加相关的方法public void addFirst(E e){ .... } //添加头public void addLast(E e) { .... } //添加尾public void push(E e){ .... } //添加头(底层调用的也是添加头的方法)将元素压入到集合的0号索引位置【2】删除相关的方法public E removeFirst() { .... } //删除头public E removeLast() { .... } //删除尾public E pop() { ..... } //删除尾(底层调用的也是删除尾的方法)删除掉最后一位索引位置的元素【3】获取相关的方法public E getFirst(){ .... } //获取头public E getLast() { .... } //获取尾
第二章 核心代码
第01节 成员变量
成员变量相关的核心代码
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{/*** 集合的长度大小*/transient int size = 0;/*** 头节点*/transient Node<E> first;/*** 尾节点*/transient Node<E> last;/*** 空参数构造方法*/public LinkedList() {}/*** 带参数构造方法,当前方法会调用 addAll()方法,* 此方法来自于祖父接口 Collection接口,表示将 c集合当中的数据添加到 LinkedList集合对象当中* 例如:* Collection<String> c = new ArrayList<>();* c.add("hello");* c.add("world");* 当我们创建 LinkedList集合对象的格式如下的时候* LinkedList<String> linked = new LinkedList<>(c);* 那么在 linked 当中包含的数据就是 "hello" 和 "world"*/public LinkedList(Collection<? extends E> c) {this();addAll(c);}/*** 来自于 LinkedList 底层的内部类,主要是记录节点的对象* 记录的数据包括三部分: item next prev* 成员变量 E item: 这里的 item 的泛型是 E 表示当前存放的元素* 成员变量 Node<E> next: 这里的 next 表示的是下一个节点的对象* 成员变量 Node<E> prev: 这里的 prev 表示的是上一个节点的对象*/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内部类)
第02节 成员方法
核心代码
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{/*** 将指定的元素追加到此列表的末尾,这个方法等效于 void addLast(E e) 方法* 参数e: 表示要添加到此列表的元素* 返回值是 true 表示无论什么元素都能添加成功,因为是List系列的集合,假如是Set系列的则可能会为false* 方法体当中调用的是 下面的 linkLast(e) 这个方法*/public boolean add(E e) {linkLast(e);return true;}/*** 将参数 e 添加到linkedList集合的最后* final Node<E> l = last 表示的是记录当前尾节点的数据值,这里的 last 是成员变量* Node<E> newNode = new Node<>(l, e, null) 表示创建新的节点对象,将l和e作为参数传入* last = newNode 表示记录 last 的值是最新对象的地址值* if (l == null) 判断是否为null 如果是null则表示是第一个元素,那么就记录 first=newNode* 否则记录 l.next = newNode; 表示不是第一个节点,则记录为 l.next=newNode* 当做好记录之后,长度 size 自增,来自于父类的变量 modCount 自增*/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;elsel.next = newNode;size++;modCount++;}
}
第三章 效果展示
第01节 案例代码
public class Test {public static void main(String[] args) {LinkedList<String> linked = new LinkedList<>();linked.add("aa");linked.add("bb");linked.add("cc");linked.add("dd");System.out.println(linked); //[aa, bb, cc, dd]}
}
第02节 过程实现
核心代码分析
核心方法分析
//说明: first 和 last 都是LinkedList 集合的成员变量Node<E>的对象
void linkLast(E e) {//这里的 l 记录的是 last 当中的地址信息,刚开始的时候 last 记录的是null final Node<E> l = last;//这里的 newNode 就是创建的节点的对象,记录的节点的地址值,例如地址值 0x01final Node<E> newNode = new Node<>(l, e, null);//这里将节点记录的地址值,赋值给了 last 那么last当中记录地址,也就是 0x01last = newNode;//判断之前记录的l是否为null, 如果是第一个元素,之前没有 l 则为 null if (l == null)//当第一个元素的时候,LinkedList的成员变量 first 就记录为 上面地址 0x01first = newNode;else//如果不是null, 则表示之前存在对象,那么前一个对象的下一个节点就记录地址 0x01l.next = newNode;//当上面的内容记录完毕之后,长度 size改变, 父类成员变量modCount值也改变size++;modCount++;
}
小结说明
- 这里的变量
l
记录的是上一个节点Node
的地址值,如果是第一个元素,则l
为null
值- 这里的变量
newNode
对象当中,包含着三个部分,分别是 前一个节点的地址值、当前的元素值、下一个节点的地址值- 两个变量
first
和last
都是LinkedList
集合当中维护的成员变量,他们的类型都是Node<E>
这种类型
图一(添加第一次数据)
图二(添加第二次数据)
图三(添加第三次数据)
图四(添加第四次数据)
第03节 动态效果
LinkedList底层链表结构相关推荐
- 手写LinKedList双向链表 终于搞清了什么是链表结构
之前对Collection这块底层实现和异同点一直模糊不清,最近手动写了个链表结构实现LinKedList ,发现很多知识还是要不断去实践,专研,才能不断提升. LinKedList 实现 List接 ...
- linkedlist链表结构原理
一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...
- java arraylist底层实现原理_ArrayList和LinkedList底层原理
ArrayList和LinkedList都是List的实现类,是在日常开发中经常被使用到的两个集合,我们来结合源码看下两个集合的不同之处. 先来看下ArrayList的源码: // 默认的初始化大小p ...
- 数据结构(数组结构、链表结构)
本来第一篇文章准备写点关于map的,但是考虑到map中可能也牵扯到数据结构,所以先随便写点就当做铺垫吧! 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 1.集合 数据结构中的 ...
- Java集合(五)LinkedList底层扩容源码分析
LinkedList的全面说明: (1)LinkedList底层实现了双向链表和双端队列特点 (2)可以添加任意元素(元素可以重复),包括null. (3)线程不安全,没有实现同步 LinkedLis ...
- php要求掌握链表结构吗,PHP 链表结构之单链表(一)
php链表结构,单链表(一) 单链表结构,我们这边定义一个节点类,属性有当前值(data)和指向下一个节点的(next) class ListNode { public $data = NULL; p ...
- 【python】关于python的链表结构实现
[参考] [https://blog.csdn.net/weixin_37728031/article/details/81145258][注意链表结构,节点包括数值和next.链表中的head] [ ...
- 详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!
LinkedList底层实现--头尾.双向节点 LinkedList的类继承结构图 1. LinkedList对象的创建 1.1 参数为空的构造方法的方法体为空. 1.2 Collection对 ...
- ArrayList 与 LinkedList 底层实现
ArrayList 与 LinkedList 都是List 类型的容器,保存数据的同时也维持着它们插入元素的顺序,LinkedList 提供了更多的方法来操作其中的数据,但是这并不意味着要优先使用Li ...
最新文章
- 关于System.InvalidOperationException异常
- 左转待转区----当同向直行信号灯绿灯亮时,左转弯的车辆进入左转待转区等候放行信号(即使此时左转弯灯是红色的) 注意:当直行红灯时候禁止进入...
- 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...
- 强烈推荐:Spring 核心知识点总结.pdf
- ubuntu 允许root用户登陆ssh
- 大话javascript 2期:执行上下文与执行上下文栈
- 怎样用JS来添加CSS样式
- python读取多通道信号中的一个通道_RFID多通道读写器的具体应用
- Auto.js 全命令整理(二) 对应用命令专题
- 适合程序员的机器人编程c语言,技术干货六:机器人编程的C++基础知识
- 基于SpringCloud Alibaba实现的论坛
- ctfmon是什么启动项_Win7启动项找不到ctfmon进程无法正常使用输入法的解决方法...
- WeChat for Linux
- windows下安装python-pcl及其问题解决办法
- 解决Hash冲突四种方法
- 更新至2021各省份上传服务器地址(航信、百旺、税务UK)
- c语言-计算摄氏温度
- 桌面计算机图标带虚线框,win10系统桌面图标有虚线框的操作方法
- Java进阶(一)面向对象进阶简介
- 长链剖分(知识点整理+板子总结)
热门文章
- 如何用70行Java代码实现深度神经网络算法
- IELTS12 TEST8 allow children to make their own choices on everyday matters
- Multi-Modal
- 单片机看门狗c语言,单片机看门狗程序
- 03-docker系列-docker容器的基本操作
- Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting
- 教你使用caret包(一)--数据预处理
- 机器学习之R语言caret包trainControl函数(控制调参)
- 中序遍历二叉树-非递归方式实现-附C++代码
- 面向对象编程及其三大特征(JAVA)