IdentityHashMap详解

在研究代码的时候看到了IndentityHashMap,以前没见过,就顺便研究记录一下。

HashMap

HashMap要put成功要看int hashCode()和boolean equals(Object obj)。

put方法的步骤:

(1)通过新key的hashCode()方法,计算出哈希码,然后从Node数组中找到对应的位置,若为null就直接放进去,若已经存在值了,进行第二步。

(2)调用新key的equals()方法去和已经存在的key比较,如果返回ture ,则视新键与已经存在的键相同,用新值去更新旧值,然后put方法返回旧值。

(3)若调用equals()返回false,则认为新键和已存在的键不一样,那就会新建一个Node节点,放在此链表里。

HashMap的put()方法返回null的特殊情况:

一、要是已经存在键的映射,但是值是null,那么调用put()方法再更新键的值时,put()方法会把旧值null返回(因为旧值为null,所以很特殊)

二、要是找到的位置上没有键的映射,put()方法也是返回null

IdentityHashMap

IdentityHashMap允许相同的key保存进来,看一下例子:


这是因为IdentityHashMap,比较key值,直接使用的是==,也就是比较地址。

总结一下:

1.对于要保存的key,k1和k2,当且仅当k1== k2的时候,IdentityHashMap才会相等,而对于HashMap来说,相等的条件则是:对比两个key的hashCode和equals。

2.IdentityHashMap不是Map的通用实现,它有意违反了Map的常规协定。并且IdentityHashMap允许key和value都为null。

3.同HashMap,IdentityHashMap也是无序的,并且该类不是线程安全的,如果要使之线程安全,可以调用Collections.synchronizedMap(new IdentityHashMap(…))方法来实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容