成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java HashMap分析之三:放入元素

開發(fā) 后端
現(xiàn)在,有了hash code,來考慮如何計算放入數(shù)組的位置。hash code值通常會很大,但是數(shù)組的大小有限,默認(rèn)只有16,大的也不能超過2的30次方。所以,用模運(yùn)算來保證在數(shù)組大小范圍內(nèi)是合理的,比如:index = hash code % array size.不過這有點(diǎn)慢,JDK采用了更快的算法。

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

  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

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

  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<K,V> 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<K,V> e = table[bucketIndex];  
  35.         table[bucketIndex] = new Entry<K,V>(hash, key, value, e);  
  36.         if (size++ >= threshold)  
  37.             resize(2 * table.length);  
  38.     } 

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

1.hash值相等

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

原文鏈接:http://blog.csdn.net/sheismylife/article/details/7355282

【編輯推薦】

  1. Java HashMap分析之二:Hash code
  2. Java HashMap分析之一:基本結(jié)構(gòu)
  3. Java集合框架總結(jié):Set接口的使用
  4. Java的位移運(yùn)算巧方法
  5. Java7的一個新類JLayer:裝飾的Swing組件
責(zé)任編輯:林師授 來源: sheismylife的博客
相關(guān)推薦

2015-08-10 15:12:27

Java實(shí)例源碼分析

2016-09-12 14:33:20

javaHashMap

2022-03-31 16:26:49

鴻蒙源碼分析進(jìn)程管理

2012-02-15 10:37:38

JavaJava Socket

2012-03-15 16:12:57

JavaHashMap

2012-03-15 16:27:13

JavaHashMap

2012-05-03 11:35:56

ApacheCXFJava

2015-10-30 15:30:54

LevelDBSSTableSybase

2023-10-07 08:05:17

數(shù)據(jù)分析模型行為分析

2011-06-24 16:26:20

SEO

2019-07-30 12:36:10

云計算微軟亞馬遜

2021-02-22 14:04:47

Vue框架項目

2019-09-28 23:17:41

zabbix運(yùn)維監(jiān)控

2017-06-01 22:59:45

Akka層次結(jié)構(gòu)Actors

2021-02-04 07:22:07

NPOI操作Excel

2022-03-22 11:33:13

AT模塊Harmony鴻蒙

2011-06-14 10:35:15

性能優(yōu)化

2013-12-11 10:40:31

虛擬化實(shí)戰(zhàn)Cluster

2011-04-12 14:43:08

XML

2021-10-29 09:44:50

C++指針變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久成人精品视频 | 中文字幕福利视频 | 亚洲超碰在线观看 | 老司机成人在线 | 午夜影晥 | 成人黄色电影在线播放 | 狠狠骚 | 一区二区三区四区视频 | av香港经典三级级 在线 | 91九色视频| 亚洲一区二区三区视频在线 | 日韩精品在线视频免费观看 | 密室大逃脱第六季大神版在线观看 | 伊人艹 | 午夜免费在线电影 | 一区二区视频在线 | 91免费在线看| 伊大人久久| 91免费观看国产 | 国产一二三视频在线观看 | 中文字幕日韩三级 | 99热精品6| 丁香五月网久久综合 | 欧美国产日韩精品 | 成人福利在线视频 | 91国在线 | 国产免费色 | 亚洲免费视频一区 | 毛片a级毛片免费播放100 | 国产日韩欧美一区二区 | 日本三级精品 | 日日夜夜精品视频 | 蜜桃综合在线 | 久草成人网 | 国产一级网站 | 青青草精品视频 | 国产视频一区二区三区四区五区 | av黄色在线| 在线国产一区 | 国产精品久久久乱弄 | 一区二区三区免费网站 |