IdentityHashMap
,使用什么的跟HashMap
相同,主要不同点在于:
- 数据结构:使用一个数组
table
来存储key:value
,table[2k]
为key
,table[2k + 1]
为value
,也即:key:value ==> table[2k]:table[2k + 1
](HashMap
使用数组 + 链表); IdentityHashMap
中的key
和value
通过==
来比较是否相等(HashMap
通过equals()
);IdentityHashMap
中的 hash冲突解决方式为线性探测法
(HashMap
为拉链法
);
具体,我们来看关键源码:
/**
* 数据存储结构:
* 使用一个数组table来存储 key - value,第 table[2k] 为key, table[2k + 1] 为value,也即:
* key:value ==> table[2k]:table[2k + 1]
* IdentityHashMap 中的 key 和 value 通过 "==" 来比较是否相等(HashMap通过equals()来比较是否相等)
* @since 1.4
*/
public class IdentityHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, java.io.Serializable, Cloneable {
private static final int DEFAULT_CAPACITY = 32;
private static final int MINIMUM_CAPACITY = 4;
private static final int MAXIMUM_CAPACITY = 1 << 29;
private transient Object[] table;// 存储键值对的数组
private int size;
private transient int modCount;
private transient int threshold;
private static final Object NULL_KEY = new Object();
// 如果key为null,使用NULL_KEY代替
private static Object maskNull(Object key) {
return (key == null ? NULL_KEY : key);
}
// 如果之前key为null,被替换为NULL_KEY,现在替换回来
private static Object u