版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ocp114/article/details/82905962
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;
}
}