【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详解前篇的更多相关文章

  1. java集合框架详解

    java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...

  2. Java—集合框架详解

    一.描述Java集合框架 集合,在Java语言中,将一系类的对象看成一个整体. 首先查看jdk中的Collection类的源码后会发现Collection是一个接口类,其继承了java迭代接口Iter ...

  3. Java集合框架详解(全)

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  4. Java集合-----List详解

    List中的元素是有序排列的而且可重复 1.LinkedList LinkedList是非线程安全的,底层是基于双向链表实现的       LinkedList常用方法:     toArray()  ...

  5. JAVA集合类型详解

    一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...

  6. Java的LinkedList详解,看源码之后的总结

    1. LinkedList实现了一个带表头的双向循环链表: 2. LinkedList是线程不同步的: 3. LinkedList中实现了push.pop.peek.empty等方法,因此Linked ...

  7. Java集合-----Set详解

    Set是没有重复元素的集合,是无序的 1.HashSet HashSet它是线程不安全的       HashSet常用方法:   add(E element)  将指定的元素添加到此集合(如果尚未存 ...

  8. Java集合-----Map详解

          Map与Collection并列存在.用于保存具有映射关系的数据:Key-Value      Map 中的 key 和  value 都可以是任何引用类型的数据      Map 中的 ...

  9. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

随机推荐

  1. Mac 安装 mysqlclient

    尝试在虚拟环境下通过 pip 安装: pip install mysqlclient 然后报错:OSError: mysql_config not found 找到官方文档 https://githu ...

  2. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心

    Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...

  3. 有关unixODBC:Data source name not found, and no default driver specified的问题

    还是昨天测试postgresql的有关Mirroring Controller的功能时出的问题(真TM是个坑). 首先说下环境: 操作系统平台:RHEL6 x86_64 unixODBC版本:2.3. ...

  4. 【离散数学】SDUT OJ 指定长度路径数

    指定长度路径数 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 题目给出一个有n个节点 ...

  5. js Array属性和用法

    //构造函数创建数组 var arr1=new Array(); //字面量的方式 var arr2=[]; 1.Array.isArray(对象)---->判断这个对象是不是数组 //判断对象 ...

  6. hdu_1051 Wooden Sticks 贪心

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. 修改chrome背景色

    参考:http://blog.csdn.net/jvortex/article/details/73895288 1.新建一个文件夹,比如customcss,包含custom.css和manifest ...

  8. Oracle权限关于with admin option和with grant option的用法

    1.with admin option with admin option的意思是被授予该权限的用户有权将某个权限(如create any table)授予其他用户或角色,取消是不级联的. 如授予A系 ...

  9. Python入门(1)

    1.编程语言 机器语言:直接用计算机能听懂的二进制指令去编写程序,需要了解硬件的细节 汇编语言:用英文标签取代二进制指令去编写程序,同样需要了解硬件的细节 高级语言:直接用人类能理解的表达方式去编写程 ...

  10. 【实战】SSL和TLS漏洞验证

    工具下载:git clone https://github.com/drwetter/testssl.sh.git 实验环境:192.168.1.22(bee-box v1.6) 192.168.1. ...