Java集合系列-Map系列-HashMap剩余源码解析

本文详细介绍了Java HashMap的删除与查询操作,包括clear()方法清除所有元素,remove()方法删除指定key的元素,以及get()方法和keySet()方法的查询过程。文章通过源码分析,揭示了HashMap在不同情况下的查找和删除策略,如链表、红黑树的处理,以及KeySet的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HashMap对元素的删除
第一个删除方法clear():清除所有元素

public void clear() {
Node<K,V>[] tab;
modCount++;
//首先判断数组是否为空,然后判断数组中是否存在元素
if ((tab = table) != null && size > 0) {
//走到这一步:说明HashMap中存在元素,需要清除
//size:表示当前HashMap的元素个数。
size = 0;
for (int i = 0; i < tab.length; ++i)
//循环数组,然后把都置为null.以便于GC
tab[i] = null;
}
}
1:将size置为0
2:将数组元素只为null,以便于GC
所以清除方法非常的简单,清除所有元素我们知道了,那么有没有把指定key的元素删除呢?答案是肯定的。

第二个删除指定key的方法remove(key):从HashMap中移除指定的元素。

public V remove(Object key) {
Node<K,V> e;
return (e = removeNode(hash(key), key, null, false, true)) == null ?
null : e.value;
}
此方法并没有做什么事,而是把删除的工作放到了removeNode方法中,如果指定的key存在,移除成功后返回原来的值,如果指定的key不存在,则返回null,接下来我们继续跟进removeNode方法。

参数分析:
1:hash:key的hash,通过hash(key)
2:key:要删除的键值对的key
3:value:要删除的键值对的value,此value是否作为删除条件,主要取决于下面的matchValue。
matchValue=true,,删除指定的key时,同时需要判断查找的key的值和value相等才被删除,如果查找的key的值与value不相等,则不删除,
matchValue=false:则此时不作为删除条件
4:matchValue:如果为true,则value作为删除条件,如果为false,则value不作为删除条件。
5:movable:删除后是否移动节点,如果为true则移动,如果为false则不移动。
说明:此方法主要有两个流程
第一个流程:查找出指定key对应的节点
第二个流程:根据条件判断是否删除。判断条件如下:
1:指定key的节点n存在
2:如果matchValue=true,则还需要判断n.value==value,或者value.equals(n.value),如果matchValue=false,则这个条件就不需要判断了。
final Node<K,V> removeNode(int hash, Object key, Object value,
boolean matchValue, boolean movable) {
Node<K,V>[] tab; Node<K,V> p; int n, index;
if ((tab = table) != null && (n = tab.length) > 0 &&
(p = tab[index = (n - 1) & hash]) != null) {
Node<K,V> node = null, e; K k; V v;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
//走到这一步:说明key对应的下标元素。
node = p;
else if ((e = p.next) != null) {
//走到这一步:说明key对应下标的元素不是key,就需要从链表或者红黑树中查找了。
if (p instanceof TreeNode)
//走到这一步:说明从红黑树中查找key对应的节点,查找方法接下会分析
node = ((TreeNode<K,V>)p).getTreeNode(hash, key);
else {
//走到这一步:说明从链表中查找key对应的节点。
do {
if (e.hash == hash &&
((k = e.key) == key ||
(key != null && key.equals(k)))) {
node = e;
break;
}
p = e;
} while ((e = e.next) != null);
}
}
if (node != null && (!matchValue || (v = node.value) == value ||
(value != null && value.equals(v)))) {
//走到这一步:说明查找到了key对应的节点,如果matchValue=true的话,查找的节点值node.value与参数给定的值相等。
if (node instanceof TreeNode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值