扫码关注官方订阅号
闭关修行中......
简单说IdentityHashMap与常用的HashMap的区别是:前者比较key时是“引用相等”而后者是“对象相等”,即对于k1和k2,当k1==k2时,IdentityHashMap认为两个key相等,而HashMap只有在k1.equals(k2) == true 时才会认为两个key相等。IdentityHashMap 允许使用null作为key和value. 不保证任何Key-value对的之间的顺序, 更不能保证他们的顺序随时间的推移不会发生变化.
IdentityHashMap有其特殊用途,比如序列化或者深度复制。或者记录对象代理。
举个例子,jvm中的所有对象都是独一无二的,哪怕两个对象是同一个class的对象,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个map来记录这样jvm中的对象,你就需要用IdentityHashMap,而不能使用其他Map实现。
IdentityHashMap
==
HashMap
equals()
hashCode()
System.identityHashCode(object)
另外一点呢就是IdentityHashMap中key能重复,但需要注意一点的是key比较的方法是==,所以若要存放两个相同的key,就需要存放不同的地址,下面用代码来说明:
import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; public class IdentityMapDemo { public static void main(String[] args) { Map identityMap = new IdentityHashMap(); identityMap.put("a", 1); identityMap.put(new String("a"), 2); identityMap.put("a", 3); System.out.println("Identity Map KeySet Size :: " + identityMap.keySet().size()); //输出结果为Identity Map KeySet Size :: 2 } }
Jdk ApiIdentityHashMap:此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。 换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时 才认为两个键 k1 和 k2 相等、在正常 Map 实现(如 HashMap)中 当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2))
(k1==k2)
(k1==null ? k2==null : e1.equals(e2))
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
简单说IdentityHashMap与常用的HashMap的区别是:前者比较key时是“引用相等”而后者是“对象相等”,即对于k1和k2,当k1==k2时,IdentityHashMap认为两个key相等,而HashMap只有在k1.equals(k2) == true 时才会认为两个key相等。IdentityHashMap 允许使用null作为key和value. 不保证任何Key-value对的之间的顺序, 更不能保证他们的顺序随时间的推移不会发生变化.
IdentityHashMap有其特殊用途,比如序列化或者深度复制。或者记录对象代理。
举个例子,jvm中的所有对象都是独一无二的,哪怕两个对象是同一个class的对象,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个map来记录这样jvm中的对象,你就需要用IdentityHashMap,而不能使用其他Map实现。
IdentityHashMap使用的是==比较key的值,而HashMap使用的是equals()HashMap使用的是hashCode()查找位置,IdentityHashMap使用的是System.identityHashCode(object)IdentityHashMap理论上来说速度要比HashMap快一点另外一点呢就是
IdentityHashMap中key能重复,但需要注意一点的是key比较的方法是==,所以若要存放两个相同的key,就需要存放不同的地址,下面用代码来说明:Jdk Api
IdentityHashMap:此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在
IdentityHashMap中,当且仅当(k1==k2)时才认为两个键 k1 和 k2 相等、在正常 Map 实现(如 HashMap)中
当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:
(k1==null ? k2==null : e1.equals(e2))