当前位置: 首页 > news >正文

HashTable详解

哈希表(HashTable)

  • 一个线程安全的哈希表实现,也叫散列表
  • 实现了Map接口,存储key-value 键值对
  • key 和 value 都不能为 null
  • O (1) 平均时间复杂度插入、删除、查找的数据结构
  • 方法都加了synchronized锁,所以线程安全
  • JDK 1.0 就有,非常古老,现在基本不用,但面试 / 老项目会遇到

一、核心概念

1. 哈希函数(Hash Function)

把任意长度的转换成固定长度的数组下标的函数。 公式:数组索引 = 哈希函数(键)

2. 哈希冲突(Hash Collision)

两个不同的键,通过哈希函数算出了同一个索引,这就是冲突。

哈希表必须解决冲突,常用方案:

  • 链地址法(拉链法):数组每个位置挂一个链表 / 红黑树(主流,如 HashMap)
  • 开放寻址法:冲突时向后找空位置存放(如 ThreadLocalMap)

二、哈希表工作原理(极简流程)

  1. 初始化一个固定 / 动态扩容的数组
  2. 存入键值对:用哈希函数计算键的索引
  3. 找到对应位置存放数据
  4. 查找 / 删除:直接通过哈希函数定位索引,无需遍历整个数组

三、相关数据结构对比

1. 哈希表 vs 数组 vs 链表

结构查找插入 / 删除适用场景
数组O(n)O(n)数据少、有序遍历
链表O(n)O(1)频繁插入删除
哈希表O(1)O(1)快速查找、键值对存储

2. HashTable vs HashMap

对比项HashMapHashTable
线程安全非安全安全(所有方法加 synchronized)
锁机制无锁锁整个哈希表(全表锁)
性能非常快很慢(高并发下性能极差)
key/value 是否允许 nullkey 允许 1 个 null,value 允许多个都不允许 null,否则 NPE
底层结构JDK8:数组 + 链表 + 红黑树数组 + 链表(无红黑树
默认容量1611
扩容方式扩容为原来的 2 倍扩容为原来的 2 倍 + 1
哈希计算优化过,扰动函数简单哈希计算
迭代器快速失败(fail-fast)安全失败(fail-safe)
父类继承 AbstractMap继承 Dictionary
推荐使用✅ 推荐(日常开发 99%)❌ 不推荐(老项目兼容)

关键区别:

1)线程安全 vs 非安全

  • HashMap无锁→ 单线程飞快,多线程会数据错乱、覆盖、死循环。
  • HashTable所有方法都加 synchronized→ 多线程安全,但整个表只能一个线程操作,性能极低。

2)是否允许 null

  • HashMap:key 可以存1 个 null,value 可以多个 null。
  • HashTablekey、value 都不能为 null,否则直接空指针异常。

3)性能差距巨大

  • HashMap:无锁,高吞吐。
  • HashTable:锁整张表,高并发下性能差

四、Java中的哈希表

  • Hashtable:JDK 原生哈希表,老旧、全表锁、线程安全,现在基本不用
  • HashMap:主力哈希表,非线程安全,查询 / 增删效率极高
  • ConcurrentHashMap:并发场景专用,线程安全、高性能
  • HashSet:底层基于HashMap,只存 key,用来去重

底层统一模型:数组 + 哈希函数 + 拉链法(链表 / 红黑树)

五、HashTable的实际用途

1. 多线程安全的键值存储

用途: 在多个线程同时读写数据时,保证数据不混乱、不丢失、不出现异常。

例如:

  • 简单的共享配置存取
  • 老项目中的共享计数器
  • 多线程日志记录、标记

2. 存在性判断、去重

用途: 判断某个 key 是否已经存在

例如:

  • 重复请求拦截
  • 黑名单校验
  • 任务去重

3. 简单线程安全缓存

用途: 把不常变的数据缓存到内存,提高访问速度。

例如:

  • 字典数据
  • 系统配置
  • 固定映射关系

4. 线程安全计数统计

用途: 多线程环境下统计次数

例如:

  • 接口访问次数
  • 用户点击次数
  • 任务执行次数

六、HashMap的实际用途

1. 存储键值对映射(最常用):

  • 封装接口参数、返回结果
  • 状态码映射、字典配置
  • 临时数据组装、对象关联

2. 快速查找、判断存在:

  • 判断用户是否存在
  • 判断手机号是否重复
  • 黑名单、白名单校验
  • 缓存命中判断

3. 数据去重:

  • 列表去重
  • 日志去重
  • 批量数据去重

4. 数据分组 / 一对多归集:

  • 按分类分组商品
  • 按状态分组订单
  • 按部门分组员工

5. 本地缓存(热点数据):

  • 缓存字典、配置、权限、地区数据
  • 减少数据库查询
  • 提升接口速度
http://www.rkmt.cn/news/1420934.html

相关文章:

  • 甘肃省天水CPPMSCMP官网报考入口,官方授权双证报考中心 - 众智商学院课程中心
  • 2026年苏州本地阳光房漏水维修领域3家合规服务提供方专业深度分析 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 2026年苏州地区地下室漏水维修正规服务商核心特征与选型分析 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 终极指南:如何用KMS_VL_ALL_AIO智能脚本一键激活Windows和Office
  • Applite终极指南:免费开源macOS软件管家,一键告别命令行烦恼
  • 3分钟解决3D纹理难题:这款免费浏览器工具如何让普通图片变身专业法线贴图?
  • 如何快速掌握BepInEx:面向游戏爱好者的终极插件框架指南
  • 2026年比话降AI率实测报告:知网论文AI率84.9%降到1.4%
  • 甘肃省嘉峪关CPPMSCMP官网报考入口,官方授权双证报考中心 - 众智商学院课程中心
  • AI时代营销变革:从效率工具到人机共生的艺术
  • 2026 年 5 月执业医师备考工具实测:破解刷题痛点的高效选择★★★★★ - 讲清楚了
  • 2026重庆速洁家政:渝中口碑好的大学城家政公司 - LYL仔仔
  • 长期使用 Taotoken 的 Token 计费模式让每笔支出都清晰可查
  • 揭开企业级集成平台的神秘面纱:iPaaS如何重塑数字化核心
  • 别再只调PID了!用一阶ESO给你的Arduino小车做个“抗干扰外挂”
  • TGA2624-SM、GaN工艺驱动9-10GHz射频信号的无损极速传输
  • AI Agent可靠性核心:驾驭框架(Harness)设计比模型选型更重要
  • 10 GPT-3 论文精读:Few-shot Learning 为什么会出现?
  • 南通婚纱照推荐:这两家领衔 五大热门品牌测评+外景场地指南 - 江湖评测
  • 分析 Taotoken 用量看板数据优化个人开发者的 Token 消耗习惯
  • 【字节跳动】山西大同塞外风电水冷超算母港 极致精细化逐条全拆解
  • 告别Everything界面!用Python 3.10+ctypes打造你的专属文件搜索命令行工具
  • HslCommunication测试工具隐藏玩法:除了测通断,还能当简易数据监控器和协议学习器
  • 泉城翡翠变现指南:从手镯到挂件,2026年本地回收商成色判定全揭秘 - 合扬奢侈品交易中心
  • 2026年青岛液氧液氮液氩供应商怎么选?一文对标工业气体全产业链 - 年度推荐企业名录
  • 全户型精工整装 金螳螂家宜昌店满足宜昌各类家装需求 - 速递信息
  • MFAC无模型自适应控制入门:从理论到Matlab仿真,如何调节λ等参数让系统响应又快又稳?
  • 2026年山东工业气体供应商选型指南:如何找到真正靠谱的液氧液氮液氩一站式服务商 - 年度推荐企业名录
  • 2026年全国十大焊接机器人服务商推荐!2026山东最新排名出炉,赛铂数控实力领先 - 十大品牌榜
  • 2026北京海淀区公司注销哪家靠谱?3家机构实测,首选志鸿润达财税! - 小柏云