如何进行IdentityHashMap集合的源码解析

2023-04-23 23:11:00 集合 源码 解析

IdentityHashMap是Java中的一种散列映射,它使用“引用”识别键比较而不是使用equals()。它的源码解析可以分为以下几步:

1、IdentityHashMap类的构造函数:

public IdentityHashMap(int initialCapacity) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
table = newEntryArray(capacity);
init();
}

上面这段构造函数代码,首先检查传入的参数initialCapacity是否小于0,如果小于0,则抛出IllegalArgumentException异常;然后检查initialCapacity是否大于最大容量MAXIMUM_CAPACITY,如果大于,则将initialCapacity设置为MAXIMUM_CAPACITY;然后将capacity设置为1,并使用“位移”操作将capacity放大到initialCapacity;最后,使用table = newEntryArray(capacity)创建一个新的Entry数组,并调用init()方法初始化IdentityHashMap。

2、IdentityHashMap类的put方法:

public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = System.identityHashCode(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
if (e.hash == hash && key == e.key) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}

上面这段put方法代码,首先检查传入的key是否为null,如果为null,则调用putForNullKey()方法;然后使用System.identityHashCode(key)获取key的hash值,并使用indexFor()方法获取key在table中的索引;接着使用for循环遍历table数组,检查是否存在hash值和key相同的Entry,如果存在,则替换旧的value,并调用recordAccess()方法记录访问;如果不存在,则modCount自增,并调用addEntry()方法添加新的Entry,最后返回null。

3、IdentityHashMap类的get方法:

public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = System.identityHashCode(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}

上面这段get方法代码,首先检查传入的key是否为null,如果为null,则调用getForNullKey()方法;然后使用System.identityHashCode(key)获取key的hash值,并使用indexFor()方法获取key在table中的索引;接着使用for循环遍历table数组,检查是否存在hash值和key相同的Entry,如果存在,则返回该Entry的value;如果不存在,则返回null。

4、IdentityHashMap类的clear方法:

public void clear() {
modCount++;
Entry<K,V>[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}

上面这段clear方法代码,首先modCount自增,然后使用for循环遍历table数组,将每个Entry设置为null;最后将size设置为0。

以上就是IdentityHashMap源码的解析,它的源码分析可以帮助我们更好的理解IdentityHashMap的实现原理,从而更好的使用它。

相关文章