Java之集合底层-数据结构

Java集合之数据结构

1 概述

数据结构是计算机科学中研究数据组织、存储和操作的一门学科。它涉及了如何组织和存储数据以及如何设计和实现不同的数据操作算法和技术。常见的据结构有线性数据结构(含数组、链表、栈和队列等),非线性数据结构(树、图等)。

注意:不同的数据结构适用于不同的场景和问题,选择合适的数据结构可以提高算法的效率和性能。

Java集合框架中不同的实现类底层借助不同数据结构来存储输出,常见的数据结构有:

  1. 数组(Array):有序集合,可以包含重复的元素,常见实现类有ArrayList、Vector
  2. 链表(LinkedList):链表是一种动态数据结构,通过节点之间的链接来组织数据。常见的链表实现类是LinkedList
  3. 集合(Set):集合是不允许包含重复元素的无序集合。常见的集合实现类有HashSet、LinkedHashSet和TreeSet
  4. 映射(Map):映射是一种键值对的集合,每个键只能对应一个值。常见的映射实现类有HashMap、LinkedHashMap和TreeMap
  5. 队列(Queue):队列是一种先进先出(FIFO)的数据结构。常见的队列实现类有LinkedList和PriorityQueue
  6. 栈(Stack):栈是一种后进先出(LIFO)的数据结构。常见的栈实现类是Stack
  7. 树(Tree):树是一种具有分层结构的数据结构,常见的树实现类有BinaryTree和BinarySearchTree

2 数组

数组(array),内存中一块连续的空间,元素数据在其中按照下标索引依次存储,比较常用的数据结构。

其特点是:通过下标索引,可以快速访问指定位置的元素,但是在数组中间位置添加数据或者删除数据会比较慢,因为数组中间位置的添加和删除元素,为了元素数据能紧凑的排列在一起,那么就会引起其后面的元素移动位置。

所以,数组查询元素较快,中间位置的插入、删除元素较慢。

在这里插入图片描述> 可以看出,数组中间添加数据后,之后的数据都要依次移动位置。同理,中间位置删除的时候也是这样

3 链表

链表(linked list),是由一个一个node节点组成,每个node节点中包含两项数据:指针域、数据域。数据域存储了一个数据,指针域存储指向下一个node节点对象的引用(单向链表)。

如果是双向链表的话,指针域会存储2个引用,一个指向前一个node节点对象,另一个指向了下一个node节点对象。

在这里插入图片描述

单链表插入、删除节点:
在这里插入图片描述

链表特点:

  • 查找元素慢,因为需要通过连接的节点,依次向后查找指定元素(没有直接的下标索引)

  • 新增和删除元素较快,例如删除,只需要让当前node节点中的引用指向另一个节点对象即可,原来的指向的node节点就相当于删除了

可以看出,只需要将数据2节点中的引用,指向数据4的节点对象即可

head表示链表的头部,tail表示链表的尾部

思考,是否能根据单向链表的特点,想象出双向链表的特点?

在这里插入图片描述

4 栈

栈(stack),又称堆栈,仅允许在栈的一端进行插入和删除操作,并且不允许在其他任何位置进行操作。

其特点是:先进后出,最先存进去的元素,最后才能取出来

例如,薯片存在薯片桶中,我们当前只能取出最上面的一个薯片,而最早存放到薯片桶的薯片,反而是我们最后吃到的一片。

在这里插入图片描述

注意1,入栈也称为压栈,把数据存入到栈的顶端位置

注意2,出栈也称为弹栈,把栈顶位置的数据取出

思考,JVM中的栈区中,为什么把main方法标注在最底端位置?

5 队列

队列(queue),仅允许在队列的一端进行插入,而在队列的另一端进行删除。

其特点是:先进先出,最先存进去的元素,可以最先取出来

例如,火车穿过山洞的时候,第一节车厢先进去山洞的一端,并且这节车厢优先从山洞的另一端出来,后面的车厢依次从一端进入并另一端出来。

队列的入口、出口分别在队列的俩端:
在这里插入图片描述

6 红黑树

二叉树(Binary tree)是树形结构的一个重要类型。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

二叉树顶上的叫根结点,两边被称作“左子树”和“右子树”。

在这里插入图片描述

二叉树中有一种叫做红黑树(Red/Black Tree),它最早被称为平衡二叉B树(symmetric binary B-trees),后来被称为红黑树。

红黑树是一种特殊化的平衡二叉树,它可以在进行插入和删除的时候,如果左右子数的高度相差较大,那么就通过特定操作(左旋、右旋)保持二叉查找树的平衡(动态平衡),从而获得较高的查找性能。

红黑树的每一个节点的左子树的所有数据都比自己小,而右子树的所有数据都比自己大,并且左右子树的高度近似。

红黑树的约束:

  1. 根节点必须是黑色
  2. 其他节点可以是红色的或者黑色
  3. 叶子节点(特指null节点)是黑色的
  4. 每个红色节点的子节点都是黑色的
  5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同

注意,红黑树的指定颜色的目的,是利用颜色值作为二叉树的平衡对称性的检查

例如,从空树开始演示一个案例:

数字插入顺序为 9、8、12、7、6,对于一个节点来说,新数据如果小于本节点,会被放在左节点的位置,反之则放在右节点的位置

在这里插入图片描述

当插入数字6的时候,对于红黑树来说整个结构失去平衡,需要通过自旋来调整,最后结果如下:
在这里插入图片描述

红黑树在线演示

可以通过在线工具,进行节点的添加,查看红黑树的动态调整的动画效果,建议使用chrome浏览器打开:

在这里插入图片描述

7 哈希表

**复习回顾:Object中hashCode**方法、Hash值的特点、以及和对象之间关系

哈希表也称散列表,是一种使用‌哈希函数组织数据的数据结构,它允许存储的数据元素以‌键值对(key-value)的形式存在,并通过直接访问对应的值

哈希函数也称为散列函数,即Object类中hashCode方法,借助该函数,可以将key-value映射到表中一个位置,从而加快查找的速度。

1)JDK8之前

Java中的哈希表(hash),JDK8之前是采用数组+链表进行实现,根据数据的哈希值,把数据存在数组中,但是当前哈希值冲突的时候,再使用链表进行存储,那么在数组中,同一hash值的数据都存在一个链表里。

例如,如果数据的哈希值相同,在数组使用使用链表存储哈希值相同的几个数据

注意:当链表中元素过多,即hash值相等的元素较多时,查找的效率会变低!

实际存储案例:

在这里插入图片描述

2)JDK8及其以后

JDK8中,哈希表存储采用数组+链表+红黑树进行实现,当链表长度超过**阈值(8)**时,将链表转换为红黑树,这样可以大大提高查找的性能。

例如,

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/383396.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索算法系列 - 双指针

目录 移动零(原题链接) 复写零(原题链接) 快乐数(原题链接) 盛最多水的容器(原题链接) 有效三角形的个数(原题链接) 查找总价格为目标值的两个商品&…

数据库表结构创建

一、原型图 二、分析 1、天气,值字段只有实测值,可用一个字段表示(单位、来源同上) 2、气温有默认值与实测值两个选项,一个字段无法表示默认值与实测值(单位,来源同上) 3、因为有…

SpringMVC 控制层框架-下

五、SpringMVC其他扩展 1. 异常处理机制 1.1 异常处理概念 开发过程中是不可避免地会出现各种异常情况,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中&a…

LoFTR关键点特征匹配算法环境构建与图像匹配测试Demo

0,LoFTR CVPR 2021论文《LoFTR: Detector-Free Local Feature Matching with Transformers》开源代码 1,项目主页 LoFTR: Detector-Free Local Feature Matching with Transformers 2,GItHub主页 GitHub - zju3dv/LoFTR: Code for "…

Vue 状态管理 Vue CLI

Vue 状态管理 & Vue CLI 1、状态管理2、集中状态管理2.1 Vuex2.1.1 Vuex核心概念2.1.2 Vuex Store实例2.1.3 Vuex Getter2.1.4 Vuex Mutation2.1.4 Vuex Actions2.1.4 Vuex Module 2.2 Pinia2.2.1功能增强 3、Vuex 实现原理4、Pinia 实现原理5、CLI5.1 实现 1、状态管理 将…

vue 搜索框

效果 创建搜索组件: 在Vue项目中,首先需要创建一个搜索组件。这个组件通常包含一个输入框和一个搜索按钮。使用v-model指令将输入框与组件的数据属性(如searchKeyword)进行双向绑定,以便获取用户输入的关键词。处理搜索…

MongoDB教程(二十一):MongoDB大文件存储GridFS

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、GridFS…

科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?

科技云报道原创。 AI从未停止进化,也从未停止给人类带来惊喜。 从ChatGPT代表的文生文、Dall-E代表的文生图,到Sora代表的文生视频,Suno为代表的文生音乐,生成式AI的“暴力美学”持续突破内容生产的天花板,大模型技术…

【LLM】-07-提示工程-聊天机器人

目录 1、给定身份 1.1、基础代码 1.2、聊天机器人 2、构建上下文 3、订餐机器人 3.1、窗口可视化 3.2、构建机器人 3.3、创建JSON摘要 利用会话形式,与具有个性化特性(或专门为特定任务或行为设计)的聊天机器人进行深度对话。 在 Ch…

vue import from

vue import from 导入文件,从XXXX路径;引入文件 import xxxx from “./minins/resize” import xxxx from “./minins/resize.js” vue.config.js 定义 : resolve(src);就是指src 目录 import xxxx from “/utils/auth” im…

新版GPT-4omini上线!快!真TM快!

大半夜,OpenAI突然推出了GPT-4o mini版本。 当我看到这条消息时,正准备去睡觉。mini版本质上是GPT-4o模型的精简版本,没有什么革命性的创新,因此我并没有太在意。 结果今天早上一觉醒来发现伴随GPT-4o mini上线,官网和…

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误,在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot,it is reported as a ‘one-time polle…

stats 监控 macOS 系统

Stats 监控 macOS 系统 CPU 利用率GPU 利用率内存使用情况磁盘利用率网络使用情况电池电量 brew install stats参考 stats github

Ansible的脚本-----playbook剧本【上】

目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一:给被管理主机安装httpd服务 2.2 实战演练二:定义、引用变量 2.3 实战演练三:指定远程主机sudo切换用户 2.4 实战演练四:when条件判断 2.5 实战演练五&…

ElasticSearch(六)— 全文检索

一、match系列查询 前面讲到的query中的查询,都是精准查询。可以理解成跟在关系型数据库中的查询类似。match系列的查询,是全文检索的查询。会通过分词进行评分,匹配,再返回搜索结果。 1.1 match 查询 "query": {&qu…

.Net Core 微服务之Consul(三)-KV存储分布式锁

引言: 集合上两期.Net Core 微服务之Consul(一)(.Net Core 微服务之Consul(一)-CSDN博客) 。.Net Core 微服务之Consul(二)-集群搭建)(.Net Core 微服务之Consul(二)-集群搭建-CSDN博客) 目录 一. Consul KV 存储 1. KV 存储介绍 1.1 数据模型 1.2 一致性和…

Centos安装、迁移gitlab

Centos安装迁移gitlab 一、下载安装二、配置rb修改,起服务。三、访问web,个人偏好设置。四、数据迁移1、查看当前GitLab版本2、备份旧服务器的文件3、将上述备份文件拷贝到新服务器同一目录下,恢复GitLab4、停止新gitlab数据连接服务5、恢复备…

Docker、containerd、CRI-O 和 runc 之间的区别

容器与 Docker 这个名称并不紧密相关。你可以使用其他工具来运行容器 您可以使用 Docker 或一堆非Docker 的其他工具来运行容器。docker只是众多选项之一,Docker(公司)在生态系统中创建了一些很棒的工具,但不是全部。 容器方面有…

47.简易电压表的设计与验证(2)

(1)Verilog 代码: module adc_collect(input clk ,input reset_n ,input [7:0] adc_data ,output clk_adc );wire clk_adc_a ;…

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下,前端上传文件就是new FormData,然后把文件 append 进去,然后post发送给后端就完事了,但是文件越大,上传的文件也就越长,如果在上传过程中,突然网络故障,又或者…