JDK1.7中HashMap的remove()源码详解

/**
 * 函数:remove(Object key)
 * 作用:删除该键值对
 * @return 返回被删除的value值,如果删除失败返回Null 
 */ 
public V remove(Object key) {  
    Entry<K,V> e = removeEntryForKey(key);  
    // 返回移除的节点的value值
    return (e == null ? null : e.value);  
}  
  
final Entry<K,V> removeEntryForKey(Object key) {
    // HashMap为空,直接返回Null  
    if (size == 0) {  
        return null;  
    }  
    // 1. 计算hash值
    int hash = (key == null) ? 0 : hash(key);  
    // 2. 计算存储的数组下标位置
    int i = indexFor(hash, table.length);  
    // 定位到key值对应的数组位置
    // prev在后面遍历链表时指向当前节点的前一个节点,e表示当前遍历到的节点
    Entry<K,V> prev = table[i];  
    Entry<K,V> e = prev;  
    // 遍历链表,找到key和hash值与传入参入相同的节点,即为要删除的节点
    while (e != null) { 
        // 记录当前节点的下一个节点 
        Entry<K,V> next = e.next;  
        Object k;  
        // 如果key值和hash值相同,则找到目标节点。执行移除操作
        if (e.hash == hash &&  
            ((k = e.key) == key || (key != null && key.equals(k)))) {  
            // 记录map结构被修改的次数,主要用于并发编程
            modCount++;  
            // 记录table存储了多少键值对,因为移除了一个,所以此处就减一
            size--; 
            // 若删除的是table数组中的元素(即链表的头结点) 
            // 则删除操作 = 将头结点的next引用存入table[i]中  
            if (prev == e) 
                table[i] = next;
            //否则 将以table[i]为头结点的链表中,当前Entry的前1个Entry中的next 设置为 当前Entry的next(即删除当前Entry = 直接跳过当前Entry)
            else  
                prev.next = next;   
            e.recordRemoval(this);  
            return e;  
        }  
        prev = e;  
        e = next;  
    }  
    
    // 返回删除的节点
    return e;  
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值