详解Java集合中的基本数据结构

 更新时间:2021年06月04日 11:33:21   作者:Liziba  
总有小伙伴让我总结一下Java集合中的基本数据结构的相关知识,今天特地整理了本篇文章,文中有非常详细的介绍,需要的朋友可以参考下

集合中三大数据结构

在这里插入图片描述

数组

  • 内存地址连续
  • 可以通过下标的成员访问,下标访问的性能高
  • 增删操作有较大的性能消耗(需要动态扩容)

在这里插入图片描述

链表(双向链表)

  • 灵活的空间要求,存储空间不要求连续
  • 不支持下标访问,支持顺序遍历搜索
  • 针对增删操作找到对应的节点改变链表的头尾指针指向即可,无需移动元数据存储位置

在这里插入图片描述

树(Java中二叉树特性)

  • 某节点的左子树节点仅包含小于该节点的值
  • 某节点的右子树节点仅包含大于该节点的值
  • 节点必须是二叉树
  • 顺序排列

在这里插入图片描述

存在问题:树可以认为是介于数组和链表二者之间的一种数据结构,拥有较快的查询速度同时拥有较快的插入和删除速度。但是在树出现极端或严重的不平衡情况下会导致效率低下

在这里插入图片描述

基于红黑树折中解决二叉树不平衡带来的效率低下问题

红黑树

  • 红黑树,Red-Black Tree [RBT]是一个自平衡(不是绝对平衡)的二叉查找树(BST),树上的每个节点需要遵循下面的规则
  • 每个节点要么是黑色,要么是红色
  • 根节点为黑色
  • 每个叶子节点(NIL)是黑色
  • 不能存在两个连续的红色节点(红色节点的两个子节点必须是黑色)
  • 任一节点到叶子节点的路径包含相同数量的黑节点

在这里插入图片描述

红黑树通过什么自平衡

左旋:以某个节点作为支点(旋转节点),其右子节点变为旋转节点的父节点,右子节点的左节点变为旋转节点的右子节点,左子节点保持不变

在这里插入图片描述

右旋:以某个节点作为支点(旋转节点),其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变

在这里插入图片描述

变色:节点的颜色由红色变为黑色或者黑色变为红色

在这里插入图片描述

红黑树插入场景

1、红黑树为空

1.1 插入节点作为根节点并把节点设置为黑色

2、插入节点的父节点为黑节点\

2.1 直接插入

3、插入节点的父节点为红节点

3.1 叔叔节点存在且为红节点

  • 1、P节点和S节点设置为黑色
  • 2、PP节点设置为红色
  • 3、PP设置为当前插入节点
  • 4、再次重复上述步骤

3.2 叔叔节点不存在或者叔叔节点为黑色

3.2.1 P节点是PP节点的左节点

3.2.1.1 插入节点是P节点的左节点

  • 1、P设置为黑色
  • 2、PP节点设置为红色
  • 3、PP节点右旋

3.2.1.2 插入节点是P节点的右节点

  • 1、P节点左旋
  • 2、把P设置为插入节点(此时等于上面的场景)
  • 3、PP节点右旋

3.2.2 P节点是PP节点的右节点

3.2.2.1 插入节点是P节点的右节点

  • 1、P节点设置为黑色
  • 2、PP节点设置为红色
  • 3、PP节点左旋

3.2.2.2 插入节点是P节点的左节点

  • 1、P节点右旋
  • 2、将P设置为插入节点(此时等于上面场景)
  • 3、PP节点左旋

PP节点左旋

3.2.2.2 插入节点是P节点的左节点

  • ​ 1、P节点右旋
  • ​ 2、将P设置为插入节点(此时等于上面场景)
  • ​ 3、PP节点左旋

在这里插入图片描述

到此这篇关于详解Java集合中的基本数据结构的文章就介绍到这了,更多相关Java数据结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot深入分析运行原理与功能实现

    SpringBoot深入分析运行原理与功能实现

    我们发现springBoot程序开发比spring程序编写起来容易的多。配置简洁,依赖关系简单,启动运行容易。那么结下了我们我们就要思考一下入门程序中的这些功能是怎么实现的
    2022-09-09
  • JAVA 多线程编程之CountDownLatch使用详解

    JAVA 多线程编程之CountDownLatch使用详解

    当多个线程需要协调和同步执行任务时,Java中的CountDownLatch(倒计时门闩)是一个常用的工具类,本文将介绍 CountDownLatch 的基本原理、用法以及示例代码,需要的朋友可以参考下
    2023-05-05
  • Java 中的vector和list的区别和使用实例详解

    Java 中的vector和list的区别和使用实例详解

    在大家还没有了解vector,list,deque的知识之前,我先给大家介绍下stl,本文重点给大家介绍vector和list的区别及使用,感兴趣的的朋友一起看看吧
    2017-09-09
  • Java StringBuilder的用法示例

    Java StringBuilder的用法示例

    这篇文章主要给大家介绍了关于Java StringBuilder用法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • RequestContextHolder.getRequestAttributes()空指针问题及解决

    RequestContextHolder.getRequestAttributes()空指针问题及解决

    这篇文章主要介绍了RequestContextHolder.getRequestAttributes()空指针问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java实现的满天星效果实例

    java实现的满天星效果实例

    这篇文章主要介绍了java实现满天星效果的方法,涉及Java绘图的应用,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • Java客户端服务端上传接收文件实现详解

    Java客户端服务端上传接收文件实现详解

    这篇文章主要介绍了Java客户端服务端上传接收文件实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • struts2中类型转换实例代码

    struts2中类型转换实例代码

    这篇文章主要介绍了struts2中类型转换实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java 面试题和答案 - (下)

    Java 面试题和答案 - (下)

    本文主要介绍Java 面试题,这里整理了Java面试题关于JDBC,线程异常处理,Servlet,JSP的知识的整理,帮助大家理解知识点,便于面试,有兴趣的小伙伴可以参考下
    2016-09-09
  • SpringBoot集成elasticsearch使用图文详解

    SpringBoot集成elasticsearch使用图文详解

    Spring Boot集成Elasticsearch其实非常简单,这篇文章主要给大家介绍了关于SpringBoot集成elasticsearch使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论