0

0

什么是Java中的IdentityHashMap类_键相等性判定依赖内存地址的特殊容器

P粉602998670

P粉602998670

发布时间:2026-02-22 19:44:03

|

561人浏览过

|

来源于php中文网

原创

identityhashmap 的 key 比较用 == 而非 equals(),故 new string("a") 与 "a" 被视为不同 key;null key 处理也基于 ==;它不支持并发,synchronizedmap 包装无效;扩容时用 system.identityhashcode(),无视重写的 hashcode();设计初衷是避免 equals() 副作用,非通用映射。

什么是java中的identityhashmap类_键相等性判定依赖内存地址的特殊容器

IdentityHashMap 的 key 比较到底用的是 == 还是 equals()

它用的是 ==,不是 equals()。这意味着两个逻辑上相等的 String 对象(比如 new String("a")"a"),只要不是同一个对象实例,就会被当成不同 key 存进去。

常见错误现象:往 IdentityHashMap 里反复 put 相同语义的 key,结果 size 持续增长,查不到值;或者用 get() 拿不到刚 put() 进去的东西——因为传入的 key 是新对象,内存地址不同。

  • 只适合你**明确控制 key 实例生命周期**的场景,比如缓存 Class 对象、Enum 实例、或你自己 new 出来的固定单例
  • 不能替代 HashMap 做通用映射,尤其别用来存字符串字面量和用户输入
  • 性能上比 HashMap 略快一点(省了 equals() 调用),但代价是语义断裂,调试时容易懵

IdentityHashMap 和 HashMap 在 null key 处理上有什么区别

两者都允许 null 作为 key,但判断方式不同:IdentityHashMapnull 当作一个特殊地址值处理,用 == 判定是否为同一 null 引用;HashMap 则专门在代码里分支处理 null

使用场景:当你需要把 null 当作一个合法、唯一的 key,并且不希望它和某个“逻辑上等于 null”的对象混淆时,IdentityHashMap 更严格。

立即学习Java免费学习笔记(深入)”;

大师兄智慧家政
大师兄智慧家政

58到家打造的AI智能营销工具

下载
  • IdentityHashMap 中,所有 null key 都指向同一个桶,因为所有 null 引用的地址值在 JVM 中是统一的
  • 但如果你误以为 new Object() == null 或者 Objects.equals(null, someObj) 会影响行为,那就踩坑了——它根本不走 equals()
  • 注意:IdentityHashMapcontainsKey(null) 返回 true 当且仅当真有 null 被 put 过,不会被子类重写影响

为什么 IdentityHashMap 不支持并发,而且不能被 Collections.synchronizedMap 包装

它的哈希表实现没加锁,也没用 volatile 或 CAS 控制状态;更关键的是,Collections.synchronizedMap 包装后,只同步了 public 方法,但 IdentityHashMap 内部的 resize、rehash 等操作仍可能在多线程下看到不一致的数组状态。

错误现象:多线程 put 后 size 返回负数、get() 随机返回 null、甚至 ConcurrentModificationException(虽然它没用 modCount)。

  • 不要在多个线程里共享未加锁的 IdentityHashMap 实例
  • Collections.synchronizedMap(new IdentityHashMap()) 是伪安全——方法调用串行了,但内部结构仍可能被破坏
  • 真要线程安全,要么用 ConcurrentHashMap(但它是基于 equals() 的),要么自己用 synchronized 块包裹整个操作序列

IdentityHashMap 的迭代顺序和扩容机制和 HashMap 一样吗

不一样。它不保证任何顺序,也不按哈希值排序;它的桶数组扩容策略类似 HashMap(2 的幂次),但 rehash 时直接用 System.identityHashCode() 计算新位置,不调用 hashCode() 方法。

这意味着:哪怕你重写了某个类的 hashCode()IdentityHashMap 也完全无视它;它只认 JVM 分配的那个原始内存地址哈希值。

  • 迭代顺序完全取决于对象创建时机和 GC 活动,每次运行都可能不同
  • 如果 key 对象被移动过(比如经过一次 full GC),System.identityHashCode() 通常不变,但极端情况下可能变化——这会导致 map 行为异常,不过概率极低
  • 别拿它做测试用的“稳定哈希容器”,它比 LinkedHashMap 还不可靠

最常被忽略的一点:IdentityHashMap 的设计初衷不是为了“高性能哈希表”,而是为了在需要引用相等性(reference equality)的底层框架中避免 equals() 带来的副作用——比如在序列化、代理、注解处理器里临时缓存对象。一旦脱离这个上下文,它就很容易变成 bug 温床。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

826

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

826

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1557

2023.10.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.8万人学习

C# 教程
C# 教程

共94课时 | 10万人学习

Java 教程
Java 教程

共578课时 | 70.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号