java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构

news2025/3/18 20:04:07

在 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 值。

对比表格

特性HashMapHashtableConcurrentHashMapHashSetLinkedHashSetCopyOnWriteArraySet
实现基础基于 HashMap基于 Hashtable基于 ConcurrentHashMap基于 HashMap基于 HashMap 和双向链表基于 CopyOnWriteArrayList
存储重复元素不允许不允许不允许不允许不允许不允许
存储 null允许不允许允许允许允许不允许
存储 null允许不允许允许---
线程安全非线程安全线程安全线程安全非线程安全非线程安全线程安全
元素顺序不保证元素的顺序不保证元素的顺序不保证元素的顺序不保证元素的顺序保证元素的插入顺序不保证元素的顺序
内部结构数组 + 链表(或红黑树)数组 + 链表数组 + 链表(或红黑树) + 分段锁数组 + 链表(或红黑树)数组 + 链表(或红黑树) + 双向链表数组 + 链表(或红黑树)
性能一般情况下性能较高性能较低性能较高,但实现复杂一般情况下性能较高相比 HashSet,插入和删除操作稍慢写操作性能较低,读操作性能较高
适用场景不需要线程安全且不需要保证顺序的场景需要线程安全且不允许 null 值的场景需要线程安全且性能较高的场景不需要线程安全且不需要保证顺序的场景需要保证元素插入顺序的场景读多写少且需要线程安全的场景

通过以上对比,可以根据具体需求选择合适的散列表和散列集实现方式。

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

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

相关文章

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,麻…

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方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤&#xff…

大数据学习(68)- Flink和Spark Streaming

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…

Fastdata极数:中国民宿行业发展趋势报告2025

2024年,中国游客出行次数大幅上涨,旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时,中国旅游业将见证一场深刻的变革,这场变革的推动力是消费者对旅游期望的转变,经济因素和年轻人全新价值观…

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…

需求分析、定义、验证、变更、跟踪(高软47)

系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果&#xff1a; 前言 在PhotoShop中我们经常会用到抠图操作&#xff0c;现在就用Shader实现一个简单的抠图效果。 实现原理&#xff1a; 使用当前像素颜色与需要抠掉的颜色相减作比较&#xff0c;然后与一个指定的阈值比较以决定是否将其显示出来&#xff1b; U…

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek&#xff1f;2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代&#xff0c;企业越来越重视数据的价值。为了…

STM32---FreeRTOS事件标志组

一、简介 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生 事件标志组&#xff1a;一组事件标志位的集合&#xff0c;可以简单的理解时间标志组&#xff0c;就是一个整体。 事件标志租的特点&#xff1a; 它的每一个位表示一个时间&#xff08;高8位不算&…