在研究代码的时候看到了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(…))方法来实现。