Java面试八股之HashSet和TreeSet有什么区别

news2025/1/18 16:56:27
  1. Java中HashSet和TreeSet有什么区别

1. 底层数据结构

HashSet: 基于哈希表(实际上是 HashMap 的内部实现)实现。每个元素通过其 hashCode() 方法计算出哈希码,并通过哈希码确定其在哈希表中的位置。这种结构使得 HashSet 在插入、删除和查找元素时具有接近 O(1) 的平均时间复杂度。

TreeSet: 基于红黑树(一种自平衡的二叉搜索树)实现。红黑树保证了树的平衡性,使得任何节点的左子树和右子树高度差不超过1,从而确保了高效的查找、插入和删除操作,这些操作的时间复杂度为 O(log n)。

2. 排序特性

HashSet: 无序集合。元素的添加、删除和遍历并不保证任何特定的顺序。虽然在内部哈希表中可能存在某种顺序,但这对外部使用者来说是不确定的,也不应依赖于这种顺序。

TreeSet: 有序集合。元素按照其自然排序(即实现 Comparable 接口并覆盖 compareTo() 方法的类的元素)或者通过提供自定义 Comparator 对象进行排序。无论何时遍历 TreeSet,元素总是按照排序规则排列。

3. 元素唯一性判断

HashSet: 使用 hashCode() 和 equals() 方法来判断元素的唯一性。只有当两个元素的 hashCode() 相同且 equals() 方法返回 true 时,才会认为它们是重复的。

TreeSet: 除了要求元素必须实现 Comparable 接口(或提供 Comparator)外,还使用比较结果(即 compareTo() 方法或 Comparator.compare() 方法返回值)来判断元素的唯一性。如果两个元素比较结果相等,那么它们在 TreeSet 中被视为重复。

4. 支持的操作

HashSet: 除了基本的 add(), remove(), contains() 等操作外,不直接支持其他与排序相关的操作,如获取某个范围内的元素、查找最值等。

TreeSet: 除了上述基本操作外,还支持一系列与排序相关的操作,如:

first() 和 last() 获取集合中的最小和最大元素。

headSet(E toElement)、tailSet(E fromElement)、subSet(E fromElement, E toElement) 分别获取小于(不包括)、大于等于(包括)、介于两个给定元素之间的子集。

pollFirst() 和 pollLast() 移除并返回集合中的最小和最大元素。

5. 其他注意事项

允许 null 值:

HashSet 允许包含一个 null 值。

TreeSet 不允许包含 null 值,除非指定了一个可以处理 null 值的 Comparator。

6. 性能与适用场景

HashSet: 适用于对元素插入、删除、查找速度要求较高,且不需要保持元素有序的情况。当需要快速查找元素是否存在,或者对集合的遍历顺序没有特定要求时,首选 HashSet。

TreeSet: 适用于需要保持元素有序(自然排序或自定义排序),并且可以接受较 HashSet 稍慢但仍然高效的插入、删除、查找操作的场景。当需要频繁执行范围查询、获取有序输出、或者需要集合始终保持排序状态时,应选用 TreeSet。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套,每套四十题选择题)获取(WX:…

零基础入门篇④ 初识Python(注释、编码规范、关键字...)

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏订阅地址 👉Python从…

Shiro核心深度解析文档

1. Shiro的介绍 它是一个简单易用的java安全框架,可以运行在非Web环境 1.主要提供的功能 身份认证 大多时称为登录,这是证明用户身份的行为 授权管理 访问控制的过程,即决定"谁"可以做"什么" 会话管理 管理特定于用户的会话,在非Web环境也是这样 密码…

echarts 图表tooltip扩展(适配移动端)

2024.5.16今天我学习了如何对echarts 图表tooltip进行自定义设置,效果如: 如果是日维度,需要展示对应的星期,以及用移动端去查看这个图表提示要显示在整个图表内,如果没有设置position会溢出图表,通用写法代…

数据结构与算法|算法总结|动态规划之编辑距离总结篇

啥也不说先上图! 本节一共总结了六道题,个人认为作为二维dp的典型用法,所以归纳到了一起,方便对比、类比学习。 718.最长重复子序列 力扣题目链接 文章链接 两个整数数组A、B,返回两个数组中 公共的、长度最长的子数组…

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动:数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展,跨域数据流动已成为现代社会的常态。从医疗记录到金融交易,从社交媒体到企业运营,数据在各个领域之间频繁交换,为社会发展带来了极大的便利…

Cocktail for Mac 激活版:一站式系统优化与管理神器

Cocktail for Mac是一款专为Mac用户打造的系统优化与管理工具,凭借其强大的功能和简便的操作,赢得了广大用户的喜爱。这款软件集系统清理、修复和优化于一身,能够帮助用户轻松解决Mac系统中的各种问题,提高系统性能。 Cocktail fo…

MySQL单表查询案例演示

目录 一、创建数据库lianxi 二、选择数据库为lianxi 三、新建一个数据表grade,在grade表中插入数据 四、开始进行查询操作(验证表中数据) 1、查询1945班的成绩信息 2、查询1945班,语文成绩大于60小于90的成绩信息 3、查询学…

电商数据分析的介绍及应用||电商数据API接口

在这到处弥漫着电商气息的社会里,人们依靠电商让生活变得简单而便捷。那么作为电商数据分析师,我们需要在海量电商数据中揭示出隐含的、先前未知的并有潜在价值的信息和规律,这也要求我们具备数据洞察和汇总能力,运用数据挖掘模型…

Leetcode-有效的括号(带图)

20. 有效的括号 - 力扣(LeetCode)https://leetcode.cn/problems/valid-parentheses/ 题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足&…

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

【physx/wasm】在physx中添加自定义接口并重新编译wasm

目录 说在前面环境搭建编译自定义接口 说在前面 操作系统:windows11wsl2physx版本:5.3.1参考:physx-js-webidl (physx版本为该作者fork出的某个版本) 环境搭建 这里使用的是wsl2docker进行编译的,搭建步骤参考:WSL2 上…

深入探索Jetpack Compose:大前端式客户端开发实战

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

win10编译openssl

环境 Win10 64位 VS2022 openssl 3.3.0 nasm NASM version 2.16.01 compiled on Dec 21 2022 perl strawberry-5.38.2.2环境变量设置 perl加入到环境变量,略过nasm加入到环境变量vs的nmake加入到环境变量我的nmake位置如下: C:\Program…

【Unity Shader入门精要 第7章】基础纹理(二)

除了用于直接表示物体表面颜色,纹理的另外一种常见用法是用来进行凹凸映射,在不增加顶点的情况下,通过纹理来提供额外的法线信息,从而在视觉上增加表面凹凸细节,丰富渲染表现。 最常用的两种凹凸映射为法线贴图和高度…

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 学习了函数后,老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数: 1.strlen函数 用于获取字符串长度(不包括末尾…

用Rust构造一个人员基本信息的实体类,输出json测试结果

目录 一、需求说明 二、知识点 serde 一、需求说明 需求描述:用Rust写一个人员基本信息的实体类, 包括编号、姓名、描述、性别、备注、照片、简历等,加上3条测试数据,输出为json。 cargo add serde serde { version "1.0.201"…

SVN切换账号

SVN切换账号 有这么一种情况,对于一个新项目,项目紧急的情况下,大家会使用一个svn账号下载代码,开始提前熟悉业务。那么当正式开发的时候,每个人的svn账号也已经下发下来了,这个时候大家就需要切换成自己的…

Jquery+Servlet+JDBC实现登录注册功能

前端部分 HTMLCSS部分 引入JQuery包和JQuery.cookie包,前者封装了DOM操作的一些方法,后者封装了对cookie的操作 我们使用cookie主要是为了做登录后页面的跳转时,能存下来这个用户是谁,这样后面可以对单一用户进行操作&#xff…

嵌入式学习-PWM输出比较

简介 PWM技术 输出比较框图介绍 定时器部分 比较器控制部分 输出控制部分 相关寄存器