【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别

  • 1、实现方式
    • HashSet
    • TreeSet
  • 2、性能
    • 添加、删除和查找操作的时间复杂度
    • HashSet
    • TreeSet
  • 3、元素唯一性
  • 4、迭代顺序
    • HashSet
    • TreeSet
  • 5、使用场景
    • HashSet
    • TreeSet
  • 6、示例代码


💖The Begin💖点点关注,收藏不迷路💖

在Java的集合框架中,HashSetTreeSet 都是常用的 Set 接口的实现类,但它们之间存在显著的区别。

1、实现方式

HashSet

  • 实现方式HashSet 是由一个哈希表来实现的,利用哈希码对元素进行存储。
  • 特点:由于哈希表的无序性,HashSet 中的元素也是无序的。

TreeSet

  • 实现方式TreeSet 是由一个树形结构(通常是红黑树)来实现的。
  • 特点:由于树形结构的有序性,TreeSet 中的元素是有序的,且默认是自然排序,也可以通过比较器进行自定义排序。

2、性能

添加、删除和查找操作的时间复杂度

HashSet

  • 时间复杂度:对于 add(), remove(), contains() 等操作,HashSet 的时间复杂度接近 O(1),因为哈希表提供了快速查找元素的能力。但是,请注意这是基于平均情况的复杂度,在最坏情况下,哈希表可能需要遍历链表中的多个元素,时间复杂度可能达到 O(n)。

TreeSet

  • 时间复杂度:由于 TreeSet 是基于树形结构实现的,对于 add(), remove(), contains() 等操作,其时间复杂度是 O(logn),其中 n 是 TreeSet 中的元素数量。

3、元素唯一性

HashSetTreeSet 都保证了元素的唯一性,即集合中不会存在重复的元素。

4、迭代顺序

HashSet

由于是无序的,迭代 HashSet 的元素时,元素的顺序是不确定的。

TreeSet

由于是有序的,迭代 TreeSet 的元素时,元素会按照某种顺序(自然顺序或自定义顺序)进行排列。

5、使用场景

HashSet

适用于需要快速查找元素且不需要关心元素顺序的场景。

TreeSet

适用于需要保持元素顺序的场景,比如排序集合中的元素或找出集合中的最小值和最大值。

6、示例代码

package com.example;import java.util.HashSet;
import java.util.TreeSet;public class SetExample {public static void main(String[] args) {HashSet<Integer> hashSet = new HashSet<>();TreeSet<Integer> treeSet = new TreeSet<>();// 添加元素hashSet.add(3);hashSet.add(1);hashSet.add(4);hashSet.add(2);treeSet.add(3);treeSet.add(1);treeSet.add(4);treeSet.add(2);// 打印元素System.out.println("HashSet中的元素(无序):" + hashSet); // 输出元素的顺序可能是不确定的System.out.println("TreeSet中的元素(有序):" + treeSet); // 输出元素的顺序是确定的,按照升序排列}
}

在这里插入图片描述

注意:

虽然 HashSet 的 add(), remove(), contains() 方法的时间复杂度通常被认为是 O(1),但在实际使用中,由于哈希冲突和链表过长等因素,性能可能会受到影响。

因此,在需要高性能的场景下,需要仔细考虑是否使用 HashSet。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了&#xff0c;合上书本给我印象比较深刻的文臣要数王守仁&#xff0c;不愧为明朝的军事家&#xff0c;思想家&#xff0c;文学家&#xff0c;教育家&#xff0c;他经过多年的思索、磨难、追求&#xff0c;终于有一天&#xff0c;在穷乡僻壤&#xff0c;…

Linux的基本指令第二篇

1.cat - 查看文件 语法&#xff1a;cat [选项] [文件] 功能&#xff1a; 查看目标文件的内容 -b 对非空输出行编号 -n对输出的所有行编号 -s不输出多行空行 现有一个文件test.c cat -n test.c cat -b test.c cat -s test.c 创建一个新文件 加入源文件的内容 || …

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 置换检验是一种非参数统计方法&#xff0c;它不依赖于数据的分布形态&#xff0c;因此特别适…

Linux——man帮助命令

一、man 获得帮助信息 基本语法&#xff1a;man [命令或配置文件] &#xff08;功能描述&#xff1a;获得帮助信息&#xff09; 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands &#xff08;标准命令&#xff09; 2、System…

Apple创始人斯蒂夫乔布斯2005年在斯坦福大学的毕业典礼演讲:Steve Jobs‘ 2005 Stanford Commencement Address

Steve Jobs’ 2005 Stanford Commencement Address Link: https://www.youtube.com/watch?vUF8uR6Z6KLc and https://www.youtube.com/watch?vHd_ptbiPoXM 文章目录 Steve Jobs 2005 Stanford Commencement AddressSummaryVocabularyTranscriptConnecting the dotsLove and …

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理&#xff1a; 1.断点续传的理解可以分为两部分&#xff1a;一部分是断点&#xff0c;一部分是续传。断点的由来是在下载过程中&#xff0c;将一个下载文件分成了多个部分&#xff0c;同时进行多个部分一起的下载&…

Adaboost集成学习 | Adaboost集成学习特征重要性分析(Python)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习特征重要性分析(Python)Adaboost(自适应增强)是一种常用的集成学习方法,用于提高机器学习算法的准确性。它通过组合多个弱分类器来构建一个强分类器。在Adaboost中,每个弱分类器都被赋予…

Ocam:高效录屏,屏幕录制最佳?

名人说&#xff1a;&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Ocam2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你…

【5】apollo编写python节点步骤及实例

在workspace/modules下新建包buildtool create --template component modules/test_one 编译包 buildtool build -p modules/test_two/ 增加自己的proto消息 在刚才自动生成的proto文件里面添加自己定义的消息,记得重新编译. syntax "proto2";package apollo;…

【python】美妆类商品跨境电商数据分析(源码+课程论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库&#xff08;DB&#xff09; 1、数据库就是存储数据的仓库&#xff0c;只不过这个仓库是在计算机存储设备上 2、严格的说&#xff0c;数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

ClickHouse备份方案

ClickHouse备份方案主要包括以下几种方法&#xff1a; 一、使用clickhouse-backup工具&#xff1a; &#xff08;参考地址&#xff1a;https://blog.csdn.net/qq_43510111/article/details/136570850&#xff09; **安装与配置&#xff1a;**首先从GitHub获取clickhouse-bac…

利用MSSQL模拟提权

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 利用MSSQL模拟提权 在MS SQL数据库&#xff0c;可以使用EXECUTE AS语句&#xff0c;以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟&#xff08;Impers…

38.MessageToMessageCodec线程安全可被共享Handler

handler被注解@Sharable修饰的。 这样的handler,创建一个实例就够了。例如: ByteToMessageCodec的子类不能被@Sharable修饰 如果自定义类是MessageToMessageCodec的子类就是线程共享的,可以被@Sharable修饰的 package com.xkj.protocol;import com.xkj.message.Message; i…

Go日常分享 - error类型是指针类型吗?

背景 这个问题的产生来源于小泉在开发rpc接口时返回error遇到的问题&#xff0c;开发时想在defer里对err进行最终的统一处理赋值&#xff0c;发现外层接收一直都未生效。问题可以简化为成下面的小demo。 func returnError() error {var err errordefer func() {//err errors…

NSIS 入门教程 (三)

引言 在教程的第二部分中&#xff0c;我们为安装程序增加了一个卸载程序&#xff0c;并查看了一些其他的向导页面以及安装部分的选择。第三部分的目标是使安装程序的外观更加现代化。 更现代的外观 为了给安装程序一个更现代的外观&#xff0c;我们要启用现代用户界面。要提…

【栈和队列】

目录 1&#xff0c;栈&#xff08;Stack&#xff09; 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 概念区分 1.6 使用链表来实现栈 2&#xff0c; 队列(Queue) 2.1 概念 2.2 队列的使用 2.3 队列模拟实现 3&#xff0c;双端队列 (Deque) 4&…

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明&#xff0c;比较异同 RISC&#xff08;精简指令集&#xff09;注重简单快速的指令执行&#xff0c;使用少量通用寄存器&#xff0c;固定长度指令&#xff0c;优化硬件性能&#xff0c;依赖软件&#xff08;如编译…

递归调用,将源路径下所有文件文件夹复制到目标路径中.

其实代码demo很简洁&#xff0c;只是逻辑有点绕&#xff0c;主要是要一层一层调用自己&#xff0c;要清楚当前是第几层调用&#xff0c;及递归调用时进的点和出的点在哪儿&#xff0c;一切就清晰明了了。 /// <summary>/// 删除指定目录下面的所有文件和文件夹/// </s…

C++学习合集

#整理到一块&#xff0c;方便查东西&#xff0c;顺便补充一些之前没有学习到的东西# 变量 char--1字节 short--2字节 int-4字节 long--4字节 long long(int)--8字节&#xff1b;准确来说变量的大小取决于编译器&#xff0c;1字节8个二进制位&#xff0c;其中最高位为符号位…