深入扒 HashMap 源码 - 6.1 HashMap 内部类 Node

Node<K,V> 可以说是 HashMap 的核心内部类之一了,它实现了 Map 结构顶层规范的 Map.Entry<K,V> (以键值对的形式储存数据的结构),在桶数据树化之前都用这个来存储数据,树化之后就改用了 TreeNode<K,V> 了

那么接下来看看都有些什么

static class Node<K,V> implements Map.Entry<K,V> {
	// 用 hash 方法计算出来的值,不是 Node 这个类下面的重写的 hashCode() 方法哦,这个 hash 表示的是元素所在桶的位置
    final int hash;
    // 要存储数据对应 key 啦
    final K key;
    // 要存储的值啦
    V value;
    // 由于是链表结构,用于存储下一个节点的信息
    Node<K,V> next;

    Node(int hash, K key, V value, Node<K,V> next) {
        // 用于找到当前元素所在桶的位置
    	this.hash = hash;
    	// 在找到所在桶的位置后,会根据 key 看看有没有相同 key 的数据,有的话就需要修改 value 的值了
    	// 没有的话才执行 new Node(...) 这个方法
        this.key = key;
        // 要存储的数据啦
        this.value = value;
        // 在大多数情况下,HashMap 中创建 Node 的实例化方法中,next 参数都是 null
        this.next = next;
    }

    // 这个方法用途就多了,从大范围看就是对 HashMap 的增删改查操作,从小范围看就仅仅获取 node 元素的 key 值
    public final K getKey()        { return key; }
    // 下面两个就不解释了
    public final V getValue()      { return value; }
    public final String toString() { return key + "=" + value; }

    // 仅仅重写了而已,暂时没有发现哪里有用
    public final int hashCode() {
    	return Objects.hashCode(key) ^ Objects.hashCode(value);
    }

    // 仅仅重写了而已,暂时没有发现哪里有用
    public final V setValue(V newValue) {
        V oldValue = value;
        value = newValue;
        return oldValue;
    }

    // 用于判断 HashMap 中是否存在该元素时需要用到,当键值都相等的情况下才能说存在,对外表示为 contains 方法和 relpace 方法的运用
    public final boolean equals(Object o) {
        if (o == this)
            return true;
        if (o instanceof Map.Entry) {
            Map.Entry<?,?> e = (Map.Entry<?,?>)o;
            if (Objects.equals(key, e.getKey()) &&
                Objects.equals(value, e.getValue()))
                return true;
        }
        return false;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值