Java中HashSet、LinkedHashSet和TreeSet的底层原理

HashSet

Java中的HashSet的底层原理主要基于哈希表(HashMap)来实现。以下是HashSet底层原理的简要总结:
数据结构:

HashSet内部使用哈希表(实际上是一个HashMap的实例)来存储元素。哈希表由一个数组(桶)和多个链表(或红黑树,在Java 8及以后版本中,当链表长度超过某个阈值时,会转换为红黑树)组成。

哈希函数

当向HashSet中添加元素时,首先会计算该元素的哈希码(通过调用对象的hashCode()方法)。哈希码是一个整数,用于确定元素在哈希表中的位置。
使用哈希码和哈希表的大小(即桶的数量)来计算元素应该存放在哪个桶中。这通常是通过哈希码与哈希表大小取模(hash % size)来实现的。

存储元素:

如果计算出的桶是空的,那么该元素就直接存放在这个桶中。
如果计算出的桶已经包含了一个或多个元素(即哈希冲突),那么这些元素会形成一个链表(或红黑树),并将新元素添加到链表的末尾(或红黑树中)。

查找元素:

当从HashSet中检索元素时,也会首先计算该元素的哈希码,然后使用哈希码来确定应该查找哪个桶。
接着,在对应的桶中遍历链表(或红黑树)来查找是否存在相同的元素。由于哈希码相同的元素被存放在同一个桶中,因此需要遍历链表(或红黑树)来找到具体的元素。

处理哈希冲突:

哈希冲突是指不同的元素具有相同的哈希码。HashSet使用链表(或红黑树)来处理哈希冲突,即将哈希码相同的元素存放在同一个链表(或红黑树)中。

动态扩容:

当哈希表中的元素数量达到某个阈值时(通常是哈希表大小的某个比例,如0.75),哈希表会自动扩容,以减小哈希冲突的可能性。扩容通常是通过创建一个新的、更大的哈希表,并将原哈希表中的元素重新分配到新的哈希表中来实现的。

无序性:

HashSet不保证元素的迭代顺序与插入顺序相同。这是因为元素在哈希表中的位置取决于其哈希码,而哈希码的计算与元素的插入顺序无关。

总之,HashSet通过哈希表和哈希函数实现了快速添加、删除和查找元素的功能,并且支持动态扩容来处理哈希冲突和保持性能。

LinkedHashSet

Java中的LinkedHashSet的底层原理主要基于HashMap和双向链表(doubly linked list)来实现。以下是对LinkedHashSet底层原理的简要总结:
数据结构:

LinkedHashSet内部使用一个特殊的HashMap实例(实际上是LinkedHashMap)来存储元素。这个HashMap不仅保存了键值对信息,还通过双向链表维护了元素的插入顺序。

双向链表:

与普通的HashMap不同,LinkedHashMap在HashMap的基础上增加了一个双向链表。这个双向链表用于维护元素的插入顺序(或访问顺序,取决于LinkedHashMap的构造参数)。
每个在LinkedHashMap中的节点(即Entry对象)都包含指向其前一个节点和后一个节点的指针(before和after属性),从而形成一个双向链表。

哈希表与双向链表的结合:

在LinkedHashSet中,元素的存储和查找主要通过哈希表来实现,以提供快速的插入、删除和查找操作。
同时,双向链表则用于维护元素的插入顺序。当元素被添加到LinkedHashSet时,它会被添加到双向链表的尾部(或头部,取决于LinkedHashMap的访问顺序策略)。

迭代顺序:

由于LinkedHashSet维护了元素的插入顺序,因此其迭代器(iterator)会按照元素的插入顺序进行遍历。这是通过遍历底层双向链表来实现的。

性能特点:

LinkedHashSet的插入、删除和查找操作的平均时间复杂度都是O(1),这与普通的HashSet相同。但是,由于LinkedHashSet需要维护双向链表,因此在内存使用上可能会稍高于HashSet。
另一方面,由于LinkedHashSet提供了有序的迭代顺序,因此在某些需要保持元素顺序的场景下,使用LinkedHashSet可能会更加方便。

继承关系:

LinkedHashSet继承自HashSet,并实现了Set接口。它的底层实现依赖于LinkedHashMap,因此LinkedHashSet在方法操作上与HashSet相同,但在迭代顺序上有所不同。

总的来说,LinkedHashSet通过结合哈希表和双向链表的结构,实现了具有可预知迭代顺序的集合。

TreeSet

Java中的TreeSet底层原理主要基于红黑树(Red-Black Tree)数据结构来实现。以下是TreeSet的底层原理的简要总结:
数据结构:

TreeSet使用红黑树作为其内部的数据结构。红黑树是一种自平衡的二叉搜索树,它能够在添加、删除和查找元素时保持较好的性能。

元素排序:

TreeSet中的元素按照其自然顺序(如果元素实现了Comparable接口)或根据提供的Comparator对象进行排序。默认情况下,元素按照升序排序。
对于数值类型(如Integer、Double),TreeSet默认按照数值本身的大小进行升序排序。
对于字符串类型,TreeSet默认按照首字符的Unicode编码进行升序排序。
对于自定义类型(如自定义对象),如果对象没有实现Comparable接口或没有提供Comparator对象,则无法直接添加到TreeSet中。

唯一性保证:

TreeSet通过红黑树的特性保证了元素的唯一性。在添加元素时,TreeSet会遍历红黑树,找到元素应该插入的位置。如果在这个位置上已经存在相同的元素(根据排序规则判断),则不会添加新的元素。

性能特点:

TreeSet的插入、删除和查找操作的平均时间复杂度都是O(log n),其中n是集合中元素的数量。这是因为红黑树在插入、删除和查找元素时,能够保持树的平衡,使得树的高度相对较低,从而提高了操作的效率。
与HashSet相比,TreeSet在插入和删除元素时可能需要更多的计算量来维护红黑树的平衡,但在需要保持元素顺序的场景下,TreeSet提供了更好的性能。

遍历方式:

TreeSet提供了多种遍历方式,包括升序遍历(自然顺序或根据提供的Comparator对象)和降序遍历(使用descendingSet()方法获取降序视图)。

继承关系:

TreeSet实现了NavigableSet接口,该接口扩展了SortedSet接口,提供了更多的导航和排序方法。因此,TreeSet不仅具有Set接口的基本功能,还提供了更丰富的排序和遍历功能。

总的来说,TreeSet通过红黑树数据结构实现了元素的排序和唯一性保证,同时提供了高效的插入、删除和查找操作以及丰富的遍历方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android11 InputReader分析

InputReader线程主要负责读取输入数据,并把数据交给InputDispatcher线程。本文以多指触摸屏为例,梳理一下InputReader的流程。 InputReader线程主要完成以下工作: 处理已有的输入设备处理新增或者移除的输入设备对输入设备产生的输入数据进行…

【数据结构与算法】力扣 226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入: root [4,2,7,1,3,6,9] 输出: [4,7,2,9,6,3,1]示例 2: 输入: root [2,1,3] 输出: [2,3,1…

【算法刷题 | 贪心算法09】4.30(单调递增的数字)

文章目录 16.单调递增的数字16.1题目16.2解法&#xff1a;贪心16.2.1贪心思路16.2.2代码实现 16.单调递增的数字 16.1题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT11的数据传递给显示任务。显示任务中&#xff0c;使用emWin中间件&#xff0c;制作屏幕的各种界面&#xff0c;并将…

程序员必备的8款工具软件,第5款简直绝了!

没错&#xff0c;今天又送福利了&#xff01;来给大家推荐一波好用的软件~ 都说程序员的电脑上有各种各样的软件工具、编辑器、插件等等&#xff0c;不同岗位的程序员使用的工具也不同。 今天就给你分享8款程序员必备的工具软件&#xff0c;看看是不是你常用的&#xff01; …

【最经典的79个】软件测试面试题(内含答案)备战“金三银四”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

锂电池管理芯片厂商拓品微电子授权世强硬创代理,产品涵盖充电/升压等系列

为进一步扩大自身品牌在国内的知名度&#xff0c;给更多硬科技企业提供锂电池管理芯片产品&#xff0c;南京拓品微电子有限公司&#xff08;下称“拓品微电子”&#xff0c;英文名&#xff1a;TOP POWER ASIC&#xff09;与拥有超30年历史的分销企业世强先进&#xff08;科技&a…

618热门好物大盘点,省心购物指南快看过来!

在618购物节即将拉开帷幕之际&#xff0c;整个互联网仿佛都弥漫着一种节日的热闹与期待。各大品牌纷纷亮出他们的杀手锏&#xff0c;推出了一系列诱人的优惠活动和特色产品&#xff0c;让人眼花缭乱&#xff0c;心动不已。如果你此刻正犹豫着该把哪一件宝贝收入囊中&#xff0c…

【JavaScript】原型

1. 什么是原型&#xff1f; 在 JavaScript 中&#xff0c;每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;它是对象的一种特殊属性。原型对象包含了对象的属性和方法&#xff0c;当我们访问对象的属性或方法时&#xff0c;如果对象本身不存在这些属性或方…

电动车违规停放监测摄像机

随着电动车的普及和城市交通拥堵问题的加剧&#xff0c;电动车的停放管理也成为一个亟待解决的难题。为了维护城市交通秩序和提高停车效率&#xff0c;一种名为电动车违规停放监测摄像机应运而生&#xff0c;成为城市管理的利器。这种电动车违规停放监测摄像机&#xff0c;利用…

实战 | 实时手部关键点检测跟踪(附完整源码+代码详解)

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

如何理解GTX发送通道的用户接口?(高速收发器二)

前文讲解了高速收发器的QPLL及CPLL和差分时钟相关内容&#xff0c;如下图所示。本文就打开高速收发器通道的内部结构&#xff0c;进行简要讲解。 图21GTXE2_CHANNEL原始拓扑 收发器的内部框图如下所示&#xff0c;上半部分是发送通道&#xff0c;下半部分是接收通道&#xff0c…

Matlab实现分段函数拟合(分段点未知)| 源码分享 | 视频教程 | 三种分段函数拟合方法

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

STM32 VS Code 扩展用户指南

系列文章目录 前言 一、视频教程快速入门 通过我们简单易学的视频教程&#xff0c;快速掌握新版本的使用方法&#xff1a; 二、功能描述 2.1 创建/导入项目 STM32 VS Code 扩展提供两种不同的项目创建选项&#xff1a; STM32CubeMX 项目&#xff1a; 这是一个依靠 CMake 作为…

(三十六)第 6 章 树和二叉树(二叉树的顺序存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? str…

web前端学习笔记7-iconfont使用

7. iconfont的使用流程 字体图标使用较多的是阿里巴巴iconfont图标库,它是阿里巴巴体验团队推出的图标库和图标管理平台,提供了大量免费和可定制的矢量图标,以满足网页设计、平面设计、UI设计、应用程序开发和其他创意项目的需求。 官方网站:https://www.iconfont.cn/ 使用…

可视化数据报道:Kompas.ai如何用图表和动态效果讲述故事

在数字化时代&#xff0c;数据无处不在&#xff0c;而如何将这些数据转化为易于理解且吸引人的故事&#xff0c;成为信息传递的关键。数据可视化作为一种强有力的工具&#xff0c;能够帮助观众快速把握复杂信息的要点&#xff0c;增强记忆&#xff0c;并激发情感共鸣。本文将深…

【BUUCTF】[RoarCTF 2019]Easy Java1

工具&#xff1a;hackbar发包&#xff0c;bp抓包。 解题步骤&#xff1a;【该网站有时候send不了数据&#xff0c;只能销毁靶机重试】 这里的登录界面是个天坑【迷魂弹】 直接点击help&#xff0c;然后进行打开hackbar——通过post请求&#xff0c;再通过bp抓包&#xff0c;…

2. 外婆都称赞的基于Jaeger的Span模型改造

前言 我们的目标是基于Jaeger来实现分布式链路追踪的Java客户端工具包&#xff0c;实际就是一个Springboot的Starter&#xff0c;在1. 看完这篇文章我奶奶都懂Opentracing了一文中我们详细的学习了一下Opentracing的相关概念以及阅读了相关的源码&#xff0c;同时特别重要的是…

深度剖析Comate智能产品:科技巧思,实用至上

文章目录 Comate智能编码助手介绍Comate应用场景Comate语言与IDE支持 Comate安装步骤Comate智能编码使用体验代码推荐智能推荐生成单测注释解释注释生成智能问答 Comate实战演练总结 Comate智能编码助手介绍 市面上现在有很多智能代码助手&#xff0c;当时互联网头部大厂百度也…
最新文章