日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
JavaHashMap分析之三:放入元素

現(xiàn)在,有了hash code,來(lái)考慮如何計(jì)算放入數(shù)組的位置。hash code值通常會(huì)很大,但是數(shù)組的大小有限,默認(rèn)只有16,大的也不能超過(guò)2的30次方。所以,用模運(yùn)算來(lái)保證在數(shù)組大小范圍內(nèi)是合理的,比如:index = hash code % array size.不過(guò)這有點(diǎn)慢,JDK采用了更快的算法。這個(gè)更快的算法源于一個(gè)數(shù)學(xué)規(guī)律,就是如果size是2的N次方,那么數(shù)X對(duì)size的模運(yùn)算結(jié)果等價(jià)于X和size-1的按位與運(yùn)算,也就是 X % size <=> X & (size -1).按位與只消耗一個(gè)CPU周期,當(dāng)然快多了?,F(xiàn)在就可理解為什么要故意把數(shù)組大小弄成2的N次方了。再回頭看一開(kāi)始計(jì)算數(shù)組大小的代碼,完全理解了。

創(chuàng)新互聯(lián)建站專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、達(dá)日網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、達(dá)日網(wǎng)絡(luò)營(yíng)銷(xiāo)、達(dá)日企業(yè)策劃、達(dá)日品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供達(dá)日建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

 
 
 
  1. int capacity = 1;  
  2.         while (capacity < initialCapacity)  
  3.             capacity <<= 1; 

比如size=16,二進(jìn)制表示如下:(32位)

0000000000000000000000000010000

size-1=15,表示如下:

0000000000000000000000000001111

假如hash code=4

0000000000000000000000000000100

4 & 15 結(jié)果為:

0000000000000000000000000000100

假如hash code=6

0000000000000000000000000000101

6 & 15 結(jié)果為:

0000000000000000000000000000101

假如hash code=38

0000000000000000000000000100110

38 & 15 結(jié)果為:

0000000000000000000000000000110

通過(guò)觀察這三個(gè)例子,又可以發(fā)現(xiàn)一個(gè)特點(diǎn),也就是X & size-1 的結(jié)果受到了size的階數(shù)的限制,這里size=16,階數(shù)為4.結(jié)果就是只用低4位的1和X按位與,而X的高位沒(méi)有用到。這會(huì)導(dǎo)致重復(fù)率相當(dāng)高。如果用一個(gè)算法將X的低位重新計(jì)算,比如根據(jù)所有位的值進(jìn)行重新計(jì)算,就可以使得hash值分布更均勻。下面的代碼揭示了在真正按位與之前,調(diào)用了hash函數(shù),進(jìn)行了一堆位運(yùn)算。至于為什么用這個(gè)算法,我也不知道其來(lái)歷。

 
 
 
  1. public V put(K key, V value) {  
  2.         if (key == null)  
  3.             return putForNullKey(value);  
  4.         int hash = hash(key.hashCode());  
  5.         int i = indexFor(hash, table.length);  
  6.         for (Entry e = table[i]; e != null; e = e.next) {  
  7.             Object k;  
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  9.                 V oldValue = e.value;  
  10.                 e.value = value;  
  11.                 e.recordAccess(this);  
  12.                 return oldValue;  
  13.             }  
  14.         }  
  15.  
  16.         modCount++;  
  17.         addEntry(hash, key, value, i);  
  18.         return null;  
  19.     }  
  20.  
  21.     static int hash(int h) {  
  22.         // This function ensures that hashCodes that differ only by  
  23.         // constant multiples at each bit position have a bounded  
  24.         // number of collisions (approximately 8 at default load factor).  
  25.         h ^= (h >>> 20) ^ (h >>> 12);  
  26.         return h ^ (h >>> 7) ^ (h >>> 4);  
  27.     }  
  28.  
  29.     static int indexFor(int h, int length) {  
  30.         return h & (length-1);  
  31.     }  
  32.  
  33.     void addEntry(int hash, K key, V value, int bucketIndex) {  
  34.         Entry e = table[bucketIndex];  
  35.         table[bucketIndex] = new Entry(hash, key, value, e);  
  36.         if (size++ >= threshold)  
  37.             resize(2 * table.length);  
  38.     } 

上面的for循環(huán)是查找并替換符合條件的對(duì)象,如果找不到,則添加新的對(duì)象。查找到的條件(必須都滿足)是:

1.hash值相等

2.key的引用相同或者key的值相等。


文章名稱(chēng):JavaHashMap分析之三:放入元素
文章起源:http://www.5511xx.com/article/ccsoohg.html