remove方法
public V remove(Object key) {
Entry<K,V> e = removeEntryForKey(key); //返回与key相同的前一个值,
return (e == null ? null : e.value);
}
final Entry<K,V> removeEntryForKey(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode()); //计算hash值
int i = indexFor(hash, table.length); //算出hash值在table中的索引
Entry<K,V> prev = table[i]; //获取索引值
Entry<K,V> e = prev;
while (e != null) {
Entry<K,V> next = e.next;
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k)))) {
modCount++; //hashmap结构变化加1
size--;// 大小减1
//如果匹配到,则将以一个值移到这里,hashmap数据结构为数组加链表
if (prev == e)
table[i] = next;
else
prev.next = next;
e.recordRemoval(this);
return e;
}
prev = e;
e = next;
}
return e;
}
//hashmap判断是否包含其中一个值
public boolean containsValue(Object value) {
if (value == null)
return containsNullValue();
Entry[] tab = table;
for (int i = 0; i < tab.length ; i++)
for (Entry e = tab[i] ; e != null ; e = e.next)
if (value.equals(e.value))
return true;
return false;
}
//清空操作是将每个对象设置为null,数组大小设置为0
public void clear() {
modCount++;
Entry[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}