1700445354
1700445355
}
1700445356
1700445357
return null;
1700445358
1700445359
}
1700445360
1700445361
注意看加粗字体部分,通过indexFor方法定位Entry在数组table中的位置,这是HashMap实现的一个关键点,怎么能根据hashCode定位它在数组中的位置呢?
1700445362
1700445363
要解释清楚这个问题,还需要从HashMap的table数组是如何存储元素的说起。首先要说明以下三点:
1700445364
1700445365
table数组的长度永远是2的N次幂。
1700445366
1700445367
table数组中的元素是Entry类型。
1700445368
1700445369
table数组中的元素位置是不连续的。
1700445370
1700445371
table数组为何如此设计呢?下面逐步来说明。先来看HashMap是如何插入元素的,代码如下:
1700445372
1700445373
public V put(K key, V value){
1700445374
1700445375
//null键处理
1700445376
1700445377
if(key==null)return putForNullKey(value);
1700445378
1700445379
//计算hash码,并定位元素
1700445380
1700445381
int hash=hash(key.hashCode());
1700445382
1700445383
int i=indexFor(hash, table.length);
1700445384
1700445385
for(Entry<K, V>e=table[i];e!=null;e=e.next){
1700445386
1700445387
Object k;
1700445388
1700445389
//哈希码相同,并key相等,则覆盖
1700445390
1700445391
if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
1700445392
1700445393
V oldValue=e.value;
1700445394
1700445395
e.value=value;
1700445396
1700445397
e.recordAccess(this);
1700445398
1700445399
return oldValue;
1700445400
1700445401
}
1700445402
1700445403
}
[
上一页 ]
[ :1.700445354e+09 ]
[
下一页 ]