【Java集合】LinkedList详解前篇
一、背景
最近在看一本《Redis深度历险》的书籍,书中第二节讲了Redis的5种数据结构,其中看到redis的list结构时,作者提到redis的list跟java的list是有本质区别的,java的list基本数据结构是数组,而redis的list却是linkedlist。然后发现自己对linkedlist这个数据结构了解的并不透彻。所以借此巩固一下。
二、内容
关于LinkedList我会花三篇文章来讲解
- 【前篇】LinkedList的结构分析
- 【中篇】LinkedList的源码分析
- 【后篇】LinkedList与ArrayList的对比
三、前置条件
由于工作中使用的JDK1.8,所以我看的源码,分析的结构都是围绕JDK1.8来分析的
四、正文
1、LinkedList的简单介绍
- LinkedList是有序的双向链表
- LinkedList在内存中开辟的内存不连续【ArrayList开辟的内存是连续的】
- LinkedList插入和删除元素很快,但是查询很慢【相对于ArrayList】
疑问:
- 什么是双向链表?
- 不是连续的内存如何保证的有序性?
- 为什么插入删除元素快?查询却很慢?
2、LinkedList的Node节点结构
如上图,LinkedList是由很多个这样的节点构成
- prev存储的是上一个节点的引用
- item存储的是具体内容
- next存储的是下一个节点的引用
这里解答【1】中的前两个疑问:
- 因为有很多个这种节点,它们依靠存放上、下一个节点的引用,从而形成了有序的链表【类比环环相扣的铁链】
- 由于前后两个节点的引用都保存,所以从前往后、从后往前都能增删改查数据。所以是双向的链表
3、LinkedList的整体结构
如上图,这就是LinkedList的整体结构,可以看到,LinkedList除了很多个node之外,还有first、last这两个变量保存头尾节点的信息
注意:
- 头结点和尾节点并没有关联起来【头节点的prev指向null、尾节点的next指向的也是null】,所以跟循环双向链表区别开来。
这里解答【1】中的最后一个疑问:
- 因为是双向链表结构,所以要删除数据时,直接将【删除节点】的首尾引用指向null,让【删除节点】的【上一个节点】的next引用指向【删除节点】的【下一个节点】,同理,【下一个节点】的prev引用指向【上一个节点】
- 同理,新增数据也一样,【新增节点】的首尾引用分表指向【上一个节点】和【被插入节点】,再将【上一个节点】的next引用指向【新增节点】,【被插入节点】的prev引用指向【新增节点】
- 查询数据慢的原因就在于它不是连续的,所以你没法像ArrayList一样get(index)快速获取数据,它需要在链表上一个个查询,直到找到你要的数据。
【Java集合】LinkedList详解前篇的更多相关文章
-
java集合框架详解
java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...
-
Java—集合框架详解
一.描述Java集合框架 集合,在Java语言中,将一系类的对象看成一个整体. 首先查看jdk中的Collection类的源码后会发现Collection是一个接口类,其继承了java迭代接口Iter ...
-
Java集合框架详解(全)
一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...
-
Java集合-----List详解
List中的元素是有序排列的而且可重复 1.LinkedList LinkedList是非线程安全的,底层是基于双向链表实现的 LinkedList常用方法: toArray() ...
-
JAVA集合类型详解
一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...
-
Java的LinkedList详解,看源码之后的总结
1. LinkedList实现了一个带表头的双向循环链表: 2. LinkedList是线程不同步的: 3. LinkedList中实现了push.pop.peek.empty等方法,因此Linked ...
-
Java集合-----Set详解
Set是没有重复元素的集合,是无序的 1.HashSet HashSet它是线程不安全的 HashSet常用方法: add(E element) 将指定的元素添加到此集合(如果尚未存 ...
-
Java集合-----Map详解
Map与Collection并列存在.用于保存具有映射关系的数据:Key-Value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 ...
-
Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
随机推荐
-
PostgreSQL的时间/日期函数使用
PostgreSQL的常用时间函数使用整理如下: 一.获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ----------- ...
-
Qualcomm device使用ION memory manager取代PMEM
今天写好device,成功编译出CM,接下来肯定是调戏啦(你什么都没看到)~ BUG肯定也是一堆堆的!一开机,果然一堆error~可是尼玛,大蛋一放假就不见人了!!! 我自己折腾几个小时容易么我,我谷 ...
-
linux 的 ping 原理
ping命令的工作原理是: ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具. 他向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文原样传回给发送者,这 ...
-
DNS—正、反向解析;委派;主从;子域;转发;智能dns等的实现
前言:DNS,耳熟能详的东西,内容太多,小编也不太好讲清,只能写几个实验详解,供大家参考. 一.简单介绍 1.DNS:通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析). 端 ...
-
[HNOI 2014]世界树
Description 题库链接 给出一棵 \(n\) 个节点的树, \(q\) 次询问,每次给出 \(k\) 个关键点.树上所有的点会被最靠近的关键点管辖,若距离相等则选编号最小的那个.求每个关键点 ...
-
Angular 路由配置
路由,简单的来说就是让组件之间进行跳转和参数的传递. 1.先在app目录下创建一个名为app.route.ts的路由组件 2.打开app.route.ts 在里面创建路由组件的代码(可通过编辑器快捷生 ...
-
keras02 - hello convolution neural network 搭建第一个卷积神经网络
本项目参考: https://www.bilibili.com/video/av31500120?t=4657 训练代码 # coding: utf-8 # Learning from Mofan a ...
-
mysql中外键的特点
mysql中外键的特点简单描述: 1.要求在从表中设置外键关系: 2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求: 3.主表的关联列必须是一个key(一般是主键或唯一键): 4. ...
-
论文总结(negFIN: An efficient algorithm for fast mining frequent itemsets)
一.论文整体思路: 作者提出了一种基于前缀树的数据结构,NegNodeset,其实是对之前前缀树的一种改进,主要区别在于采用了位图编码,通过这种数据结构产生的算法称为negFIN. negFIN算法高 ...
-
【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...