2024年150道高频Java面试题(十九)

37. HashSet 和 TreeSet 的区别是什么?

HashSet 和 TreeSet 都是 Java 中 Set 接口的实现,用于存储不包含重复元素的集合。它们之间的主要区别在于性能、元素排序和使用的场景。

  1. 排序:
    • HashSet:不保证元素的顺序。它使用哈希表来实现,所以元素的顺序是依赖于哈希函数的结果。
    • TreeSet:根据元素的天然顺序或者比较器来排序,元素以红黑树的形式存储,可以进行排序和范围查找。
  2. 性能:
    • HashSet 的添加、删除和检查操作通常比 TreeSet 更快,因为这些操作的时间复杂度接近于 O(1)。
    • TreeSet 的添加和删除操作的时间复杂度为 O(log n),因为它需要维护元素的红黑树结构。
  3. null 值:
    • HashSet 允许包含 null 值。
    • TreeSet 不允许包含 null 值,因为 null 无法与任何对象进行有效的比较。
  4. 线程安全性:
    • 两者都不是线程安全的,如果需要在多线程环境中使用,需要外部同步或者使用 Collections.synchronizedSet() 方法进行包装。
  5. 迭代顺序:
    • HashSet 迭代顺序是不确定的,取决于哈希桶中的元素分布。
    • TreeSet 迭代顺序是确定的,元素按照排序顺序遍历。
  6. 使用场景:
    • 当集合中元素的顺序不重要,且不需要排序时,优先选择 HashSet。
    • 当需要有序集合,或者需要高效的范围查询操作时,应该使用 TreeSet。

以下是简单的代码示例,说明两者的基本使用:

// 使用 HashSet
Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("cherry");
// hashSet 的迭代顺序可能每次都不同
for (String fruit : hashSet) {System.out.println(fruit);
}// 使用 TreeSet
Set<String> treeSet = new TreeSet<>();
treeSet.add("apple");
treeSet.add("banana");
treeSet.add("cherry");
// treeSet 的迭代顺序总是相同的,即按照字典序排序
for (String fruit : treeSet) {System.out.println(fruit);
}

综上,选择 HashSet 还是 TreeSet 取决于具体的应用场景,如果需要快速访问和插入操作,则选择 HashSet;如果需要元素排序或范围操作,则选择 TreeSet。

38. 如何决定使用 HashMap 还是 TreeMap?

在决定使用 HashMap 还是 TreeMap 时,主要需要考虑以下几个方面:

  1. 数据排序需求
    • 如果需要按键的自然顺序或自定义顺序遍历键值对,应该使用 TreeMapTreeMap 底层使用红黑树实现,能够保证键值对处于有序状态。
    • 如果不需要排序,或者对顺序没有要求,可以使用 HashMap。它基于哈希表实现,提供了更快的访问速度。
  2. 性能考虑
    • 对于大多数情况,HashMap 提供了常数时间性能(O(1))的 getput 操作,如果哈希函数分布得当,且没有发生大量的哈希冲突。
    • TreeMapgetput 操作通常需要 O(log n) 的时间复杂度,因为它们涉及到树形结构的维护。
  3. 内存占用
    • HashMap 通常比 TreeMap 占用更少的内存,因为红黑树结构比哈希表的链表和数组结构更加复杂。
  4. 键的类型
    • 如果键的类型没有实现 Comparable 接口,或者不希望基于键的自然顺序进行排序,那么只能使用 HashMap
    • 如果键的类型实现了 Comparable 接口,或者提供了自定义比较器,TreeMap 是一个更好的选择。
  5. 功能需求
    • 如果需要额外的操作,如查找最接近的键(floorKey)、最高键(ceilingKey)等,TreeMap 提供了这些方法。
    • 如果仅需基本的映射操作,HashMap 提供了足够的功能。

以下是一个简单的表格,总结上述信息:

特性/集合HashMapTreeMap
顺序性无序有序
性能O(1)(平均)O(log n)(平均)
内存占用较低较高
键类型要求无要求需实现 Comparable 或提供比较器
额外功能基本映射操作额外的导航方法

基于以上因素,可以根据具体应用场景来选择使用 HashMap 还是 TreeMap

领【150 道精选 Java 高频面试题】请go公众号:码路向前 。

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

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

相关文章

什么是MariaDB

2024年4月6日&#xff0c;周六晚上 今晚在Debian12上安装mysql时&#xff0c;运行后却发现是MariaDB MariaDB是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。MariaDB由MySQL的原始开发者之一Michael "Monty&qu…

Redission--布隆过滤器解决缓存穿透问题

布隆过滤器在缓存穿透问题中的使用 布隆过滤器的核心是一个位数组 布隆过滤器的误判 使用Redission的布隆过滤器步骤 添加 Redission 依赖&#xff1a;首先需要将 Redission 添加到你的 Java 项目中&#xff0c;你可以通过 Maven 来添加 Redission 的依赖。 创建 Redissio…

【Java SE】7.3类和对象

目录 1.封装 1.1封装的概念 1.2访问限定符 1.3封装扩展之包 1.3.1包的概念 1.3.2导入包中的类 1.3.3自定义包 1.3.4包的访问权限控制举例。 1.3.5常见的包 2.static成员 2.1再谈学生类 2.2static修饰成员变量 2.3static修饰成员方法 2.4static成员变量初始化 3.代…

深度学习相关知识

一.环境配置 1.cuda/cudnn安装&#xff1a; 安装cuda之前首先安装vs&#xff0c;vs版本从低到高安装。 a) 安装cuda&#xff1a;首先查看显卡支持的最高CUDA的版本&#xff0c;以便下载对应的CUDA安装包&#xff1b; cmd命令行&#xff1a;nvidia-smi,显示如下&#xff1a;…

【单片机】CJSH22-CH2O,甲醛传感器,甲醛传感器数据读取处理

原理图 解析程序 逻辑是&#xff1a; 1、初始化串口和定时器10ms中断 2、循环读取一帧数据到rev_CH2O_bufferdata 3、在主函数解析数据rev_CH2O_bufferdata 4、最终的pm2.5数值就是CH2O_value 使用CH2O_value的数据即可。 PPB单位&#xff0c;除以1000就是ppm&#xff0c;再…

ASP.NET Core 模型绑定

&#x1f340;介绍 在C#中&#xff0c;特别是在ASP.NET Core中&#xff0c;模型绑定是一个将HTTP请求中的数据映射到C#对象的过程。它使得开发者能够方便地从请求中提取数据&#xff0c;而无需手动解析请求体、查询字符串、路由数据等。ASP.NET Core提供了多种特性&#xff08…

C语言 | Leetcode C语言题解之第13题罗马数字转整数

题解&#xff1a; 题解&#xff1a; int romanToInt(char* s) {int symbolValues[26];symbolValues[I - A] 1;symbolValues[V - A] 5;symbolValues[X - A] 10;symbolValues[L - A] 50;symbolValues[C - A] 100;symbolValues[D - A] 500;symbolValues[M - A] 1000;int a…

春招百题--堆

一、堆的定义 二、堆&#xff08;优先队列&#xff09; 堆通常用于实现优先队列&#xff08;priority_queue&#xff09;&#xff0c;大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看&#xff0c;我们可以将“优先队列”和“堆”看作等价的数据结构。 堆的…

【算法-数组】二分查找法

这里写自定义目录标题 一、二分查找法是什么?二、二分查找法易错点三、如何解决上述提到的问题四、左闭右闭写法五、左闭右开写法 一、二分查找法是什么? 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target&#xff0c;返回target在数…

迷茫下是自我提升

长夜漫漫&#xff0c;无心睡眠。心中所想&#xff0c;心中所感&#xff0c;忧愁当前&#xff0c;就执笔而下&#xff0c;写下这篇文章。 回忆过往 回想当初为啥学前端&#xff0c;走前端这条路&#xff0c;学校要求嘛&#xff0c;兴趣爱好嘛&#xff0c;还是为了钱。 时间带着…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V3.0 升级 自定义查询关键词、时间段、粗略判断新闻是否和优化营商环境相关,避免自己再一个个判断

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&a…

【微信小程序】【小程序样式加载不出来】

微信小程序配置sass 第一步&#xff1a;找配置文件 在项目中找到 project.config.json文件&#xff0c;在setting属性中添加 useCompilerPlugins属性&#xff0c;值为sass即可&#xff0c;若是 less,将数组里面的值改为less即可 "useCompilerPlugins": ["sas…

HAL STM32主从定时器联级使用

HAL STM32主从定时器联级使用 具体介绍参考STM32参考手册 &#x1f33f;主从定时器联级&#xff1a;使用一个定时器作为另一个定时器的预分频器。 &#x1f341;时钟关系&#xff1a; &#x1f33f;TIM1 和TIM8 控制寄存器 2(TIMx_CR2)相关位&#xff1a; &#x1f516;主…

需求工程

对象类&#xff08;实体类、边界类、控制类&#xff09;抽象封装继承与泛化多态接口消息组件模式和复用 设计原则 单一职责原则&#xff1a;设计目的单一的类开放封闭原则&#xff1a;对扩展开放&#xff0c;对修改封闭李氏(Liskov)替换原则&#xff1a;子类可以替换父类依赖…

效率系列(十) macOS软件管理工具

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 macOS 上的软件管理工具 Homebrew 1、简介 Homebrew 是 macOS 上的包管理器&#xff0c;用户可以通过简单的命令行工具安装和管理软件包 Homebrew 在安装软件时能自动处理依赖问题&#xff0c;简化软件包的安装流程&…

每日OJ题_优先级队列_堆④_力扣295. 数据流的中位数

目录 力扣295. 数据流的中位数 解析代码 力扣295. 数据流的中位数 295. 数据流的中位数 难度 困难 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr…

AI大语言模型GPT —— R 生态环境领域数据统计分析

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…

电商技术揭秘八:搜索引擎中的SEO内部链接建设与外部推广策略

文章目录 引言一、 内部链接结构优化1.1 清晰的导航链接1. 简洁明了的菜单项2. 逻辑性的布局3. 避免深层次的目录结构4. 使用文本链接5. 突出当前位置6. 移动设备兼容性 1.2 面包屑导航1. 显示当前页面位置2. 可点击的链接3. 简洁性4. 适当的分隔符5. 响应式设计6. 避免重复主页…

Windows11下Docker使用记录(二)

Docker使用记录&#xff08;二&#xff09; 1. 常用指令2. Dockerfile示例3. 构建docker image Docker中container&#xff0c;image&#xff0c;dockerfile 以及docker hub的关系如图所示&#xff0c;详细可见上一篇帖子。 本文主要记录Dockerfile相关。 1. 常用指令 常用指令…

索引总结(2)

013 为什么官方建议使用自增长主键作为索引&#xff1f;&#xff08;说一下自增主键和字符串类型主键的区别和影响&#xff09; 自增主键能够维持底层数据顺序写入读取可以由b树的二分查找定位支持范围查找&#xff0c;范围数据自带顺序 字符串无法完成以上操作 014 使用int…