打字猴:1.700445329e+09
1700445329 //判断getEntry是否为空
1700445330
1700445331 return getEntry(key)!=null;
1700445332
1700445333 }
1700445334
1700445335 getEntry方法会根据key值查找它的键值对(也就是Entry对象),如果没有找到,则返回null。我们再来看看该方法又是如何实现的,代码如下:
1700445336
1700445337 final Entry<K, V>getEntry(Object key){
1700445338
1700445339 //计算key的哈希码
1700445340
1700445341 int hash=(key==null)?0:hash(key.hashCode());
1700445342
1700445343 //定位Entry, indexFor方法是根据hash定位数组的位置的
1700445344
1700445345 for(Entry<K, V>e=table[indexFor(hash, table.length)];e!=null;e=e.next){
1700445346
1700445347 Object k;
1700445348
1700445349 //哈希码相同,并且键也相等才符合条件
1700445350
1700445351 if(e.hash==hash&&((k=e.key)==key||(key!=null&&key.equals(k))))
1700445352
1700445353 return e;
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
[ 上一页 ]  [ :1.700445329e+09 ]  [ 下一页 ]