ç¨è¿åªäºMapç±»ï¼é½æä»ä¹åºå«ï¼HashMapæ¯çº¿ç¨å®å
¨çå,并åä¸ä½¿ç¨çMapæ¯ä»ä¹ï¼ä»ä»¬
å
é¨åçåå«æ¯ä»ä¹ï¼æ¯å¦åå¨æ¹å¼ï¼hashcodeï¼æ©å®¹ï¼é»è®¤å®¹éçã
JAVA8çConcurrentHashMap为ä»ä¹æ¾å¼äºå段éï¼æä»ä¹é®é¢åï¼å¦æä½ æ¥è®¾è®¡ï¼ä½ å¦ä½
设计ã
æ没ææ顺åºçMapå®ç°ç±»ï¼å¦ææï¼ä»ä»¬æ¯æä¹ä¿è¯æåºçã
hashmapçå®ç°åçï¼
https://blog.csdn.net/mbshqqb/article/details/79799009ä¸é¢æ¯èªå·±çæ»ç»:
åå¨ç»æ:
éé¢åå¨çæ¯ä¸ä¸ªentryæ°ç»ï¼æ¯ä¸ªæ°ç»å
ç´ ä¸çç»ææ¯ä¸ä¸ªentryé¾è¡¨
Entryæ¯mapä¸çä¸ä¸ªéæå
é¨ç±»ï¼å
¶ä¸çåéæ:key,value,hashcocd,ä¸ä¸ä¸ªEntry
ä»ä¹æ¯hashï¼
å称æ£åï¼å°ä»»æé¿åº¦çè¾å
¥éè¿æ£åç®æ³è½¬æ¢æåºå®é¿åº¦çè¾åºï¼è¯¥è¾åºå°±æ¯æ£åå¼ãè¿æ¯ä¸ç§å缩æ å°ï¼æ£åå¼ç空é´é常è¿å°äºè¾åºç空é´ãä¸åçè¾å
¥æå¯è½ä¼æ£ååºç¸åçè¾åºï¼å æ¤ä¸è½ä»æ£åå¼æ¥ç¡®å®å¯ä¸çè¾å
¥å¼ãè¿ä¹æ¯ä¸ºä»ä¹æ¯è¾ä¸¤ä¸ªå¯¹è±¡ä¸è½ä»
ä»
使ç¨hashcodeæ¹æ³æ¯è¾çåå ã
hash碰æ:
对ä¸åçå¼è¿è¡hashè¿ç®çæäºç¸åçæ£åå¼ãè¿ä¸ªæ¯ä¸å¯é¿å
çï¼ä½æ¯æ们éè¦å°½éçåå°å
¶å¸¦æ¥çæ失ã
(1)设计好çhashç®æ³è®©å
¶å°½å¯è½çåå¸åå
hashmapä¸çhashç®æ³è§£æ
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
让keyçhashcodeæ¬èº«ä¸å®å³ç§»16ä½å¼æï¼æ¯ä¸ºäºè®©å®çé«ä½ä¸ä½ä½æ··åï¼å¢å ä½ä½çéæºæ§ï¼åæ¶ä¹åç¸ä¿æäºé«ä½çç¹å¾
计ç®å
ç´ ä½ç½®çç®æ³:
int index = hash & (arrays.length-1);
é£ä¹è¿ä¹å°±æç½äºä¸ºä»ä¹HashMapçæ°ç»é¿åº¦æ¯2çæ´æ°å¹ãæ¯å¦ä»¥åå§é¿åº¦ä¸º16为ä¾ï¼16-1 = 15ï¼15çäºè¿å¶æ°ä½00000000 00000000 00001111ãå¯ä»¥çåºä¸ä¸ªåºæ°äºè¿å¶æåä¸ä½å¿
ç¶ä½1ï¼å½ä¸ä¸ä¸ªhashå¼è¿è¡ä¸è¿ç®æ¶ï¼æåä¸ä½å¯è½æ¯0ä¹å¯è½æ¯1ãä½å¶æ°ä¸ä¸ä¸ªhashå¼è¿è¡ä¸è¿ç®æåä¸ä½å¿
ç¶ä¸º0ï¼é ææäºä½ç½®æ°¸è¿æ å°ä¸ä¸å¼ã
对äºnullå¼çå¤ç
hashmapæ¯æ¥ånullå¼çï¼nullå¼è¢«æ¾å¨æ°ç»ç第ä¸ä¸ªå
ç´ å½ä¸ï¼ååºæ¥çæ¶åæä¹å¤çå¢ï¼
hashmapçå·¥ä½åçï¼
å®çéé¢æä¸ä¸ªEntryæ°ç»ï¼å¨putæ¶æ们å
æ ¹æ®keyå¼è®¡ç®åºhashcodeï¼è¿è计ç®åºè¯¥å
ç´ å¨æ°ç»ä¸çä½ç½®ï¼å°å¥å¼å¯¹å°è£
å¨Map.Entry对象ä¸ï¼ç¶ååå¨å¨æ°ç»ä¸
è¥äº§çhashå²çªæä¹åï¼
æ¯ä¸ªæ°ç»å
ç´ çä½ç½®é½æ¯ä¸ä¸ªé¾è¡¨ç»æï¼è¥è®¡ç®åºæ¥çhashcodeç¸ååå°å
ç´ è¿½å å°è¯¥é¾è¡¨å½ä¸ï¼è¿æ¯hashmapçå¤çæ¹å¼
å¨åå
ç´ çæ¶åï¼å
计ç®keyå¼å¯¹åºçhashcode ï¼æ¾å°å
ç´ æå¨çä½ç½®ï¼ç¶åè°ç¨keyçequalsæ¹æ³å»éåé¾è¡¨ï¼æåæ¾å°å
ç´
è¿æåªäºè§£å³hashå²çªçæ¹æ³ï¼
å¼æ¾å®åæ³
è¿ç§æ¹æ³ä¹ç§°åæ£åæ³ï¼å
¶åºæ¬ææ³æ¯ï¼å½å
³é®åkeyçåå¸å°åp=Hï¼keyï¼åºç°å²çªæ¶ï¼ä»¥p为åºç¡ï¼äº§çå¦ä¸ä¸ªåå¸å°åp1ï¼å¦æp1ä»ç¶å²çªï¼å以p为åºç¡ï¼äº§çå¦ä¸ä¸ªåå¸å°åp2ï¼â¦ï¼ç´å°æ¾åºä¸ä¸ªä¸å²çªçåå¸å°åpi ï¼å°ç¸åºå
ç´ åå
¥å
¶ä¸ã
ååå¸æ³
è¿ç§æ¹æ³æ¯åæ¶æé å¤ä¸ªä¸åçåå¸å½æ°ï¼
Hi=RH1ï¼keyï¼ i=1ï¼2ï¼â¦ï¼k
å½åå¸å°åHi=RH1ï¼keyï¼åçå²çªæ¶ï¼å计ç®Hi=RH2ï¼keyï¼â¦â¦ï¼ç´å°å²çªä¸å产çãè¿ç§æ¹æ³ä¸æ产çèéï¼ä½å¢å äºè®¡ç®æ¶é´ã
é¾å°åæ³
è¿ç§æ¹æ³çåºæ¬ææ³æ¯å°ææåå¸å°å为içå
ç´ ææä¸ä¸ªç§°ä¸ºåä¹è¯é¾çåé¾è¡¨ï¼å¹¶å°åé¾è¡¨ç头æéåå¨åå¸è¡¨ç第i个åå
ä¸ï¼å èæ¥æ¾ãæå
¥åå é¤ä¸»è¦å¨åä¹è¯é¾ä¸è¿è¡ãé¾å°åæ³éç¨äºç»å¸¸è¿è¡æå
¥åå é¤çæ
åµã
建ç«å
Œ
±æº¢åºåº
è¿ç§æ¹æ³çåºæ¬ææ³æ¯ï¼å°åå¸è¡¨å为åºæ¬è¡¨å溢åºè¡¨ä¸¤é¨åï¼å¡æ¯ååºæ¬è¡¨åçå²çªçå
ç´ ï¼ä¸å¾å¡«å
¥æº¢åºè¡¨ã
é»è®¤çè´è½½å å0.75
å½mapç大å°è¶
è¿å½å容éçç¾åä¹75æ¶ä¼è¿è¡èªå¨æ©å®¹ï¼ä¼å°åæ¥ç对象éæ°æ¾å°æ°çæ°ç»ä¸
rehash çè¿ç¨æ¯ä»ä¹æ ·åçï¼
说ç½äºå°±æ¯å
resizeï¼çæä¸ä¸ªæ°çEntryæ°ç»ï¼åtransferå°åæ°ç»ä¸çå¼éæ°è®¡ç®indexæ¾å
¥æ°çæ°ç»ä¸ï¼ç¶åæ¹åéå¼ä¸ºæ°çé¿åº¦xè´è½½å å
å¦ækey为nullï¼è¿å§ç»ä¼è¢«æ£åå°table[0]ç桶ä¸ï¼å³ä½¿æ¯rehashçè¿ç¨ä¹æ¯ä¸æ ·ãénullçkeyä¹æå¯è½ä¼è¢«æ£åå°table[0]çä½ç½®ï¼ä¾å¦ä¸å¾ä¸key=âfâï¼èä¸ç¸åçkeyå¨å¨ä¸åçæ¶é´å¯è½ä¼è¢«æ£åå°ä¸åçä½ç½®ï¼è¿ä¸rehashæå
³ã
è¿ä¸ªè¿ç¨ä¸å®¹æåçä»ä¹é®é¢å¢ï¼
容æ产çæ¡ä»¶ç«äºï¼å¦æå¨æ©å®¹çè¿ç¨ä¸putæ°æ®ï¼ä¼é æææ³ä¸å°çç»æãæè
å¦æ两个线ç¨é½è§¦åäºæ©å®¹ï¼ä¹ä¼åå¨é®é¢
è¿åæ没æéå°è¿ä»ä¹æ¯è¾å¥½çä¾åï¼
jdk1.8以åæ¹æäºçº¢é»æ ï¼ä¸ºä»ä¹ï¼è¯´ä¸ä¸çº¢é»æ çåçï¼
hashmapä¸hashtableçåºå«ï¼
HashTableåHashMapçå®ç°åçå ä¹ä¸æ ·ï¼å·®å«æ éæ¯
HashTableä¸å
许keyåvalue为null
HashTableæ¯çº¿ç¨å®å
¨ç
ä½æ¯HashTable线ç¨å®å
¨ççç¥å®ç°ä»£ä»·å´å¤ªå¤§äºï¼ç®åç²æ´ï¼get/putææç¸å
³æä½é½æ¯synchronizedçï¼è¿ç¸å½äºç»æ´ä¸ªåå¸è¡¨å äºä¸æ大éã
å¤çº¿ç¨è®¿é®æ¶åï¼åªè¦æä¸ä¸ªçº¿ç¨è®¿é®ææä½è¯¥å¯¹è±¡ï¼é£å
¶ä»çº¿ç¨åªè½é»å¡ï¼ç¸å½äºå°ææçæä½ä¸²è¡åï¼å¨ç«äºæ¿çç并ååºæ¯ä¸æ§è½å°±ä¼é常差ã
ç¯å¹
æéï¼æªå®å¾
ç»