打字猴:1.700445369e+09
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 }
1700445404
1700445405 modCount++;
1700445406
1700445407 //插入新元素,或者替换同哈希的旧元素并建立链表
1700445408
1700445409 addEntry(hash, key, value, i);
1700445410
1700445411 return null;
1700445412
1700445413 }
1700445414
1700445415 注意看,HashMap每次增加元素时都会先计算其哈希码,然后使用hash方法再次对hashCode进行抽取和统计,同时兼顾哈希码的高位和低位信息产生一个唯一值,也就是说hashCode不同,hash方法返回的值也不同。之后再通过indexFor方法与数组长度做一次与运算,即可计算出其在数组中的位置,简单地说,hash方法和indexFor方法就是把哈希码转变成数组的下标,源代码如下:
1700445416
1700445417 static int hash(int h){
1700445418
[ 上一页 ]  [ :1.700445369e+09 ]  [ 下一页 ]