java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构
在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。
联系与区别
联系
- 基于哈希表原理:两者都使用哈希表来存储数据,通过哈希函数将键映射到数组中的特定位置。
- 高效操作:都提供了快速的插入、删除和查找操作,时间复杂度平均为 O(1)。
区别
- 数据结构类型:
- 散列表(Hash Table):存储键值对(key-value pairs),每个键映射到一个值。
- 散列集(Hash Set):存储唯一的元素(values),不存储键值对。
- 用途:
- 散列表(Hash Table):适用于需要存储和快速查找键值对的场景。
- 散列集(Hash Set):适用于需要存储唯一元素且不需要键值对的场景。
实现类
散列表(Hash Table)
- 主要实现类:
HashMap:非线程安全,允许存储null值和null键。Hashtable:线程安全,不允许存储null值和null键。ConcurrentHashMap:线程安全,允许存储null值和null键,使用分段锁提高并发性能。
散列集(Hash Set)
- 主要实现类:
HashSet:基于HashMap实现,非线程安全,允许存储null值。LinkedHashSet:基于HashMap和双向链表实现,非线程安全,允许存储null值,保证元素的插入顺序。CopyOnWriteArraySet:线程安全,基于CopyOnWriteArrayList实现,不允许存储null值。
优缺点
散列表(Hash Table)
-
HashMap
- 优点:
- 非线程安全,性能较高。
- 允许存储
null值和null键。 - 支持链表和红黑树,提高查找效率。
- 缺点:
- 非线程安全,需要外部同步。
- 不保证元素的顺序。
- 优点:
-
Hashtable
- 优点:
- 线程安全,所有公共方法都是同步的。
- 不允许存储
null值和null键。
- 缺点:
- 性能较低,因为所有方法都是同步的。
- 不允许存储
null值和null键。
- 优点:
-
ConcurrentHashMap
- 优点:
- 线程安全,使用分段锁提高并发性能。
- 允许存储
null值和null键。 - 支持链表和红黑树,提高查找效率。
- 缺点:
- 相比
HashMap,实现较为复杂。
- 相比
- 优点:
散列集(Hash Set)
-
HashSet
- 优点:
- 非线程安全,性能较高。
- 允许存储
null值。 - 实现简单。
- 缺点:
- 非线程安全,需要外部同步。
- 不保证元素的顺序。
- 优点:
-
LinkedHashSet
- 优点:
- 非线程安全,允许存储
null值。 - 保证元素的插入顺序。
- 非线程安全,允许存储
- 缺点:
- 相比
HashSet,插入和删除操作稍慢。 - 非线程安全。
- 相比
- 优点:
-
CopyOnWriteArraySet
- 优点:
- 线程安全,适用于读多写少的场景。
- 不允许存储
null值。
- 缺点:
- 写操作性能较低,因为每次写操作都会创建一个新的数组副本。
- 不允许存储
null值。
- 优点:
对比表格
| 特性 | HashMap | Hashtable | ConcurrentHashMap | HashSet | LinkedHashSet | CopyOnWriteArraySet |
|---|---|---|---|---|---|---|
| 实现基础 | 基于 HashMap | 基于 Hashtable | 基于 ConcurrentHashMap | 基于 HashMap | 基于 HashMap 和双向链表 | 基于 CopyOnWriteArrayList |
| 存储重复元素 | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 |
存储 null 值 | 允许 | 不允许 | 允许 | 允许 | 允许 | 不允许 |
存储 null 键 | 允许 | 不允许 | 允许 | - | - | - |
| 线程安全 | 非线程安全 | 线程安全 | 线程安全 | 非线程安全 | 非线程安全 | 线程安全 |
| 元素顺序 | 不保证元素的顺序 | 不保证元素的顺序 | 不保证元素的顺序 | 不保证元素的顺序 | 保证元素的插入顺序 | 不保证元素的顺序 |
| 内部结构 | 数组 + 链表(或红黑树) | 数组 + 链表 | 数组 + 链表(或红黑树) + 分段锁 | 数组 + 链表(或红黑树) | 数组 + 链表(或红黑树) + 双向链表 | 数组 + 链表(或红黑树) |
| 性能 | 一般情况下性能较高 | 性能较低 | 性能较高,但实现复杂 | 一般情况下性能较高 | 相比 HashSet,插入和删除操作稍慢 | 写操作性能较低,读操作性能较高 |
| 适用场景 | 不需要线程安全且不需要保证顺序的场景 | 需要线程安全且不允许 null 值的场景 | 需要线程安全且性能较高的场景 | 不需要线程安全且不需要保证顺序的场景 | 需要保证元素插入顺序的场景 | 读多写少且需要线程安全的场景 |
通过以上对比,可以根据具体需求选择合适的散列表和散列集实现方式。
相关文章:
java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构
在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。 联系与区…...
python编写的一个打砖块小游戏
游戏介绍 打砖块是一款经典的街机游戏,玩家控制底部的挡板,使球反弹以击碎上方的砖块。当球击中砖块时,砖块消失,球反弹;若球碰到挡板,则改变方向继续运动;若球掉出屏幕底部,玩家失…...
【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)
目标 通过vsCode用python访问deepseek。 环境准备 没有环境的,vscode环境准备请参考之前的文章,另外需安装ollama: 【菜鸟飞】用vsCode搭建python运行环境-CSDN博客 AI入门1:AI模型管家婆ollama的安装和使用-CSDN博客 选读文章…...
Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)
文章目录 注册和登录简单操作说明Figma介绍**核心特点**1. **云端协作与实时同步**2. **跨平台兼容**3. **高效设计工具**4. **原型交互与动效**5. **开发对接友好**6. **插件生态**7. **版本控制与历史记录** **适用场景**- **团队协作**:远程团队共同设计、评审、…...
Text-to-SQL将自然语言转换为数据库查询语句
有关Text-To-SQL方法,可以查阅我的另一篇文章,Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言,这段时间公司有这方面的需求,调研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…...
什么是 Fisher 信息矩阵
什么是 Fisher 信息矩阵 Fisher 信息矩阵是统计学和机器学习中一个重要的概念,它用于衡量样本数据所包含的关于模型参数的信息量。 伯努利分布示例 问题描述 假设我们有一个服从伯努利分布的随机变量 X X X,其概率质量函数为 P ( X ...
XSS漏洞靶场---(复现)
XSS漏洞靶场—(复现) 反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL,服务器接收到请求后将恶意脚本反射回响应页面,浏览器执行该脚本从而造成攻击,恶意脚本不会在服务器端存储。 Level 1(反射型XSS) 此漏…...
基于ssm的电子病历系统(全套)
一、系统架构 前端:jsp | bootstrap | jquery 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…...
Linux-数据结构-线性表-单链表
一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 【2】特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存…...
基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别
【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目,以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤ÿ…...
通过 Python 爬虫提高股票选股胜率
此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...
OpenEuler20.3 安装 Elasticsearch7.17
1、下载elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz.sha512 shasum -a 512 -c elasticsea…...
大数据学习(68)- Flink和Spark Streaming
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Fastdata极数:中国民宿行业发展趋势报告2025
2024年,中国游客出行次数大幅上涨,旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时,中国旅游业将见证一场深刻的变革,这场变革的推动力是消费者对旅游期望的转变,经济因素和年轻人全新价值观…...
图论——广度优先搜索实现
99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)
1.问题描述: 使用华为内置的MapComponent, 发现显示不出来。查看日志, MapRender底层有报错。 解决方案: 麻烦按以下步骤检查下地图服务,特别是签名证书指纹那部分。 1.一般没有展示地图,可能和没有配置…...
【MySQL】B树和B+树的区别?MySQL为什么选用B+树作为索引数据结构?
B树和B树的区别: 结构方面: 1.节点存储内容: B树: 节点同时存储索引和数据。B树:只有叶子节点存储数据记录或指向数据记录的指针,非叶子节点只存键值,用于索引。 B 树的非叶子节点可以存储更…...
鸿蒙路由 HMrouter 配置及使用一
1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…...
ERC-6909 最小多代币标准
ERC-6909 Token标准是 ERC-1155 Token标准的一种简化替代方案。 ERC-1155 标准引入了一种多Token接口,使得单个智能合约能够结合可替代的和不可替代的Token(即,ERC20 和 ERC721)。 ERC-1155 解决了多个挑战,例如降…...
各省水资源平台 水资源遥测终端机都用什么协议
各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…...
需求分析、定义、验证、变更、跟踪(高软47)
系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…...
从零开始 | C语言基础刷题DAY3
❤个人主页:折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目: 写一个代码打印1-100之间所有3的倍数的数字 代码: int main(){int i 0;for (i 1; i < 100; i){if (i % …...
PostreSQL指南-内幕探索-学习笔记-01-数据库集簇的逻辑与物理结构
目录 一、环境信息 二、参考内容 三、逻辑结构概念 四、物理结构概念 五、逻辑映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 五、物理映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 六、数据库文件布局 1、表格 2、postmaster.pid文件解…...
docker入门篇
使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台,它可以让开发者将应用程序及其依赖打包到一个容器中,然后在任何环境中运行这个容器࿰…...
Unity Shader - UI Sprite Shader之简单抠图效果
Sprite抠图效果: 前言 在PhotoShop中我们经常会用到抠图操作,现在就用Shader实现一个简单的抠图效果。 实现原理: 使用当前像素颜色与需要抠掉的颜色相减作比较,然后与一个指定的阈值比较以决定是否将其显示出来; U…...
本地仓库设置
将代码仓库初始化为远程仓库,主要涉及在服务器上搭建 Git 服务,并将本地代码推送到服务器上。以下是详细的步骤: 1. 选择服务器 首先,你需要一台服务器作为代码托管的远程仓库。服务器可以是本地服务器、云服务器,甚…...
30、Vuex 为啥可以进行缓存处理
Vuex 状态管理基础与缓存的关联 Vuex 的核心概念: Vuex 主要由五个部分组成:state、mutations、actions、getters和modules。其中,state是存储数据的地方,类似于一个全局的数据仓库。在这个菜谱 APP 的例子中,缓存的数…...
ngx_http_conf_ctx_t
定义在 src/http/ngx_http_config.h typedef struct {void **main_conf;void **srv_conf;void **loc_conf; } ngx_http_conf_ctx_t; ngx_http_conf_ctx_t 是 Nginx 中用于管理 HTTP 配置上下文的核心结构体,其设计体现了 Nginx 多级配置&…...
vllm-openai多服务器集群部署AI模型
服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…...
Cluster Computer(SCI1区)投稿常见问题
Cluster Computer(SCI1区)投稿常见问题 目录 Cluster Computer(SCI1区)投稿常见问题怎么查询sci投稿的详细时间节点怎么查看sci投稿期刊邀请几个审稿人,几个审稿接受邀请**一、格式问题:作者简介与照片添加****二、审稿周期长:催稿邮件模板****三、查重超标(阈值通常20…...
