privatestaticfinal ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("segments", Segment[].class),
new ObjectStreamField("segmentMask", Integer.TYPE),
new ObjectStreamField("segmentShift", Integer.TYPE)
};
新版本里没实际意义的方法 为了兼容过去版本而存在的
staticclass Node
节点类 继承自Map接口的Entry内部类
finalinthash;
哈希值属性
final K key;
键属性
volatile V val;
值属性
volatile Node
下一个节点
Node(inthash, K key, V val, Node
this.hash = hash;
this.key = key;
this.val = val;
this.next = next;
}
构造方法为属性挨个赋值
publicfinal K getKey() { returnkey; }
publicfinal V getValue() { returnval; }
getter方法
publicfinalint hashCode() { returnkey.hashCode() ^ val.hashCode(); }
节点的hashCode方法是键的hashCode和值的hashCode进行异或
publicfinal String toString(){ returnkey + "=" + val; }
toString方法
publicfinal V setValue(V value) {
thrownew UnsupportedOperationException();
}
值的setter方法
publicfinalboolean equals(Object o) {
Object k, v, u; Map.Entry,?> e;
return ((oinstanceof Map.Entry) &&
(k = (e =(Map.Entry,?>)o).getKey()) != null &&
(v = e.getValue()) !=null &&
(k == key || k.equals(key)) &&
(v == (u = val) || v.equals(u)));
}
equals方法 就是判断键值对都不为空 且键值对要么==返回true 要么equals返回true
Node
Node
if (k != null) {
do {
K ek;
if (e.hash == h &&
((ek = e.key) == k || (ek != null && k.equals(ek))))
returne;
} while ((e = e.next) != null);
}
returnnull;
}
}
find方法进入do while循环遍历链表挨个遍历下一个节点判断如果节点的哈希值和参数哈希值相等且参数键和节点的键相等就返回这个节点