【Java集合】LinkedList详解前篇
【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 ...
随机推荐
- (获取qq群成员信息,并下载头像,每个群保存一个文件夹)
# 1.获取到自己qq里面所有的群,并且保存每个群里面的群成员信息到mongodb里面# 下载每个群的群成员的头像# 1.抓包,抓到获取自己所有qq群的接口 requests模块 https://qu ...
- winform datagridview数据显示不全
如果是内容是汉字,列的宽度设置不够时会自动换行,如果是数字和字母,是不会自动换行的,要把列宽设得足够,整个表格显示不全时,下面会有横向滚动条,如果看不见可能是高度超出了母控件的高度,设得低点就看见了
- 【转】c# delegate
源地址:https://www.cnblogs.com/lcawen/p/6645358.html
- python 安装虚拟环境步骤
1.python3.6.3 注: 1.安装的时候,装上你的pip 2.安装的时候,把环境变量记得勾选 3.如果你手动更改安装位置,更改到随意的盘根目录下 2.MySQL pycharm最好安 ...
- mybatis学习笔记(五):mybatis 逆向工程
mybatis学习笔记(五):mybatis 逆向工程 在日常开发中,如果数据库中存在多张表,自己手动创建 多个pojo 类和编写 SQL 语法配置文件,未免太过繁琐,mybatis 也提供了一键式生 ...
- 自动备份数据库crond
#!/bin/bash # export and backup the abgent_web database.sql mysqldump -uuser -ppassword ltden_db --s ...
- 二分查找法C语言实现
[问题描述] 生成一个随机数组A[64] ,在数组中查找是否存在某个数num. [答案] #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ...
- linux vmalloc和kmalloc
kmalloc是内核低端内存的分配,而vmalloc对应内核高端内存的分配.kmalloc()分配的内存处于3GB-high_memory之间,这一段内核空间与物理内存的映射. kmalloc保证分配 ...
- cnd 计费流量查询服务模块设计与实现
一.cdn模块结构: 2.内部模块结构:
- input 和 select
var source = $('input[name="source"]:checked').val(); var completenum = $("#completen ...