共同学习Java源代码-多线程与并发-ConcurrentHashMap(二)
2018-01-23 07:33
411 查看
privatestaticfinal
ObjectStreamField[] serialPersistentFields = {
new
ObjectStreamField("segments", Segment[].class),
new
ObjectStreamField("segmentMask", Integer.TYPE),
new
ObjectStreamField("segmentShift", Integer.TYPE)
};
新版本里没实际意义的方法 为了兼容过去版本而存在的
staticclass Node<K,V>
implementsMap.Entry<K,V> {
节点类 继承自Map接口的Entry内部类
finalinthash;
哈希值属性
final K
key;
键属性
volatile V
val;
值属性
volatile Node<K,V>
next;
下一个节点
Node(inthash, K
key, V
val, Node<K,V>
next) {
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<K,V> find(inth, Object
k) {
Node<K,V> e =
this;
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循环遍历链表挨个遍历下一个节点判断如果节点的哈希值和参数哈希值相等且参数键和节点的键相等就返回这个节点
ObjectStreamField[] serialPersistentFields = {
new
ObjectStreamField("segments", Segment[].class),
new
ObjectStreamField("segmentMask", Integer.TYPE),
new
ObjectStreamField("segmentShift", Integer.TYPE)
};
新版本里没实际意义的方法 为了兼容过去版本而存在的
staticclass Node<K,V>
implementsMap.Entry<K,V> {
节点类 继承自Map接口的Entry内部类
finalinthash;
哈希值属性
final K
key;
键属性
volatile V
val;
值属性
volatile Node<K,V>
next;
下一个节点
Node(inthash, K
key, V
val, Node<K,V>
next) {
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<K,V> find(inth, Object
k) {
Node<K,V> e =
this;
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循环遍历链表挨个遍历下一个节点判断如果节点的哈希值和参数哈希值相等且参数键和节点的键相等就返回这个节点
相关文章推荐
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(三)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(九)
- 共同学习Java源代码-多线程与并发-AbstractExecutorService类(三)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十二)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(一)
- 共同学习Java源代码-多线程与并发-CompletionService接口和ExecutorCompletionService类
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十六)
- 共同学习Java源代码-多线程与并发-ConcurrentMap接口
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(八)
- 共同学习Java源代码-多线程与并发-Executor、ExecutorService接口
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十三)
- 共同学习Java源代码-多线程与并发-FutureTask类(三)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十四)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十)
- 共同学习Java源代码-多线程与并发-FutureTask类(二)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(四)
- 共同学习Java源代码-多线程与并发-ConcurrentHashMap(一)
- 共同学习Java源代码-多线程与并发-FutureTask类(一)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(七)
- 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(二)