(注意:本文源码基于JDK1.8)
继承结构
static class Node<K,V> implements Map.Entry<K,V> {
………………省略很多代码…………
}
Node类定义在HashMap中,以静态内部类形式存在,HashMap对象持有的底层数组对象,它的每一个元素都是Node对象,而每个Node对象又持有Key对象、持有Value对象、持有称为hash的一个int值、也负责持有下一个Node对象(单链表结构使用)
Node类实现了Map.Entry接口,这是个泛型接口,规范了作为结点类的能力!接下来先学习Node的构造方法,看看可以如何创建一个Node对象
Node构造方法分析
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
用于创建Node对象的构造方法时,需传入4个参数,传入一个hash值(Key对象生成的)、传入Key对象、传入Value对象、传入一个Node对象
传入的对象会赋值给Node对象的四个同名实例变量持有
重要的四个实例变量:表示Node对象持有静态方法hash()计算后的int值、持有key对象、持有value对象,以及持有表示指向下一个Node对象
getKey()方法分析
public final K getKey() { return key; }
用于返回Node对象持有的key对象
getValue()方法分析
public final V getValue() { return value; }
用于返回Node对象持有的Value对象
toString()方法分析
public final String toString() { return key + "=" + value; }
重写toString()方法,返回一个由key对象toString方法+"="+value对象toString方法的字符串,方便字符串调试
hashCode()方法分析
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
重写hashCode()方法,定义自己的规则,使用Key对象与Value对象的异或结果作为返回结果
setValue()方法分析
public final V setValue(V newValue) {
V oldValue = value;
value = newValue;
return oldValue;
}
用于改变Node对象持有的Value对象为传入的newValue,最后再返回旧的Value对象
equals()方法分析
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;
}
重写了equals()方法,定义了Node对象的相等性规则
总结
1、Node对象持有的四个实例变量,hash、key、value、next,缺一不可