`HashMap`、`Hashtable` 和 `HashSet`的区别
HashMap
、Hashtable
和 HashSet
都是 Java 中常用的集合类,它们的功能和实现有所不同,尽管它们都使用哈希表(hash table)作为底层数据结构。以下是它们之间的主要区别:
1. HashMap 和 Hashtable 的区别
特性 | HashMap | Hashtable |
---|---|---|
线程安全性 | 不支持线程安全(非同步) | 线程安全,所有方法都加了 synchronized 锁 |
性能 | 因为没有同步,性能较高(适用于单线程或同步控制由外部管理的场景) | 由于同步机制,性能相对较差 |
null 键和值 | 允许一个 null 键和多个 null 值 | 不允许 null 键和 null 值 |
迭代器 | Iterator (快速失败) | Enumerator (过时,不推荐使用) |
引入时间 | 从 JDK 1.2 引入 | 从 JDK 1.0 引入 |
扩容机制 | 默认初始容量是 16,负载因子为 0.75,扩容时容量变为原来的 2 倍 | 同样的扩容机制,但在高并发情况下性能较差 |
总结:
HashMap
是Hashtable
的改进版,不支持线程同步,因此在单线程环境中或者需要外部同步的环境中性能更高。Hashtable
是线程安全的,但性能较差,且其 API 中的Enumerator
被淘汰,现在通常推荐使用HashMap
或者更现代的并发集合类。
2. HashMap 和 HashSet 的区别
特性 | HashMap | HashSet |
---|---|---|
底层数据结构 | 基于哈希表(HashMap 是由 HashMap 实现的,键值对结构) | 基于哈希表(其实是 HashMap 的包装,元素是集合的键) |
元素类型 | 存储键值对(Key-Value),每个键映射到一个值 | 存储单一元素,不存储值,只关心键 |
键值对 | 每个元素是一个 key-value 对(即包含键和值) | 每个元素只有一个 key (没有值) |
实现接口 | 实现了 Map 接口 | 实现了 Set 接口 |
重复元素 | 允许重复值,但键不可重复 | 不允许重复元素(没有值的概念) |
添加元素的方式 | 使用 put(key, value) 添加元素 | 使用 add(element) 添加元素 |
用途 | 适用于需要存储键值对的场景 | 适用于存储唯一元素的场景(去重) |
总结:
HashMap
存储的是键值对(key-value
),是一个Map
类型的集合。HashSet
存储的是唯一的元素,它的底层是基于HashMap
实现的,实际上,它将每个元素作为HashMap
的键,并将值设置为一个常量对象。
3. Hashtable 和 HashSet 的区别
特性 | Hashtable | HashSet |
---|---|---|
底层数据结构 | 基于哈希表(Hashtable 是一个 Map 接口的实现类) | 基于哈希表(实际上是通过 HashMap 实现的,存储唯一元素) |
线程安全性 | 线程安全(方法加锁) | 不支持线程安全(非同步) |
元素类型 | 存储键值对(key-value ) | 存储单一元素,去重集合 |
重复元素 | 键不可重复,值可以重复 | 不允许重复元素(没有值的概念) |
性能 | 由于方法都加锁,性能较差 | 无锁设计,性能较高 |
用途 | 适用于存储键值对的线程安全集合 | 适用于存储不重复元素的集合(去重) |
总结:
Hashtable
是线程安全的Map
类型,存储的是键值对。HashSet
是非线程安全的集合类,存储唯一的元素(值没有意义,只有键),底层通过HashMap
实现。
小结
HashMap
:实现了Map
接口,存储键值对,线程不安全,允许null
键和null
值。Hashtable
:线程安全,存储键值对,早期版本的Map
,不允许null
键和值,性能较低。HashSet
:实现了Set
接口,存储唯一元素,底层实现使用HashMap
,线程不安全。
如果不需要线程安全,建议使用 HashMap
和 HashSet
。如果需要线程安全,可以考虑使用 ConcurrentHashMap
或者使用 Collections.synchronizedMap()
和 Collections.synchronizedSet()
来包装非线程安全的集合。
相关文章:
`HashMap`、`Hashtable` 和 `HashSet`的区别
HashMap、Hashtable 和 HashSet 都是 Java 中常用的集合类,它们的功能和实现有所不同,尽管它们都使用哈希表(hash table)作为底层数据结构。以下是它们之间的主要区别: 1. HashMap 和 Hashtable 的区别 特性HashMapH…...

Arduino中解析JSON数据
JSON JSON(JavaScript Object Notation,即JavaScript对象表示法)是一种广泛采用的开放标准文件格式与数据交换格式。它兼具人类可读性和机器易解析性,使得数据的编写、阅读、生成及解析都变得十分便捷。JSON的设计不依赖于特定编…...

linux----文件访问(c语言)
linux文件访问相关函数 打开文件函数 - open 函数原型:int open(const char *pathname, int flags, mode_t mode);参数说明: pathname:这是要打开的文件的路径名,可以是绝对路径或者相对路径。例如,"/home/user/…...
源码分析之Openlayers中MousePosition鼠标位置控件
概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。 源码分析 MousePosition…...

以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
myexcel的使用
参考: (1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md (2)源代码: https://github.com/liaochong/myexcel/issues 我: (1)m…...
Unity 上好用的插件
PlayerMaker BehaviorDesigner Cinemachine Timeline Hybrid Addressable AssetBundle Blower Simple Zoom 大地图上缩放和平移使用ScrollRect的好效果实现...

Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
目录 1. 简介 2. VIO 配置 2.1 VIO IP 2.2 VIO 对比 ILA 3. VIO 示例 3.1 Led 3.1.1 工程配置 3.1.2 效果展示 3.2 Key 3.2.1 工程配置 3.2.1 效果展示 3.3 门控触发 3.3.1 工程配置 3.3.2 效果展示 4. 远程调试 4.1 配置目标主机 4.2 配置本机 4.3 vmWare 网…...

双臂机器人
目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...

【Lua热更新】上篇
Lua 热更新 - 上篇 下篇链接:【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...
Ubuntu批量修改文件名
文章目录 批量重命名文件:Ubuntu下使用find命令结合sed和mv参考 批量重命名文件:Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中,有时我们需要批量重命名一批文件,比如将文件名中的某个特定字符串替换为另一个字符串。…...

食家巷大烤馍:岁月沉淀下的麦香传奇
在繁华都市的街角巷尾,隐藏着许多不为人知的美食宝藏,食家巷大烤馍便是其中之一。它宛如一位低调的美食大师,默默散发着独特的魅力,用最质朴的味道,征服着每一个过往食客的味蕾。 初见食家巷大烤馍,你会被…...

harmony UI组件学习(1)
Image 图片组件 string格式,通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式,可以加载像素图,常用在图片编辑中 Image(pixelMapobject) Resource格式,加…...
BTP Integration Suite CPI Apache Camel
官网文档: https://help.sap.com/docs/integration-suite/sap-integration-suite/what-is-sap-integration-suite CPI 云集成(CPI)有以下几个特性: SAP Cloud Integration通过消息交换支持端到端流程集成。 它基于Apache软件基金会的开源框架Camel。 …...

vitepress-打包SyntaxError: Element is missing end tag.
一、vitepress打包编译报错Element is missing end tag. 背景: 新增了一些笔记准备上传到git仓库,持续集成部署的时候,控制台报错了,错误信息如下: SyntaxError: Element is missing end tag. 仔细看了下控制台几乎没啥…...

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例:重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…...

Java进程占用的内存有哪些部分?
大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域…...
【华为OD机试真题】【2024年E卷】数值同化-队列BFS(C++/Java/Python)
文章目录 分值:200题目描述思路复杂度分析AC 代码 分值:200 题目描述 存在一个 m * n 的 二维数组只,其成员取值范围为0, 1, 2。其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。而值为2的元素…...
“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”
想象一下,你有一个神奇的糖果盒,这个糖果盒里有两种糖果:红色的和蓝色的。你闭上眼睛,从盒子里拿出一个糖果,然后尝一尝,你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则࿰…...
linux中docker命令大全
基本命令 docker pull 拉取镜像 docker pull docker push 推送镜像到DockerRegistry docker push docker images 查看本地镜像 docker images docker rmi 删除本地镜像 docker rmi docker run 创建并运行容器(不能重复创建) docker run d…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...