¡¡¡¡ÔÚJavaµÄÊÀ½çÀÎÞÂÛÀ໹ÊǸ÷ÖÖÊý¾Ý£¬Æä½á¹¹µÄ´¦ÀíÊÇÕû¸ö³ÌÐòµÄÂß¼ÒÔ¼°ÐÔÄܵĹؼü¡£ÓÉÓÚ±¾È˽Ӵ¥ÁËÒ»¸öÓйØÐÔÄÜÓëÂ߼ͬʱ²¢´æµÄÎÊÌ⣬ÓÚÊǾͿªÊ¼Ñо¿Õâ·½ÃæµÄÎÊÌâ¡£ÕÒ±éÁË´ó´óССµÄÂÛ̳£¬Ò²°Ñ¡¶Java ÐéÄâ»ú¹æ·¶¡·£¬¡¶apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector¡·£¬ºÍ¡¶Thinking in Java¡··ÁËÒ²ÕÒ²»µ½ºÜºÃµÄ´ð°¸£¬ÓÚÊÇÒ»Æø֮ϰÑJDKµÄ src ½âѹ³öÀ´Ñо¿£¬À©È»¿ªÀÊ£¬Ëìд´ËÎÄ£¬¸ú´ó¼Ò·ÖÏí¸ÐÊܺÍ˳±ãÑéÖ¤ÎÒÀí½â»¹ÓÐûÓЩ¶´¡£ ÕâÀï¾ÍÄÃHashMapÀ´Ñо¿°É¡£
¡¡¡¡HashMap¿ÉνJDKµÄÒ»´óʵÓù¤¾ß£¬°Ñ¸÷¸öObjectÓ³ÉäÆðÀ´£¬ÊµÏÖÁË¡°¼ü££Öµ¡±¶ÔÓ¦µÄ¿ìËÙ´æÈ¡¡£µ«Êµ¼ÊÀïÃæ×öÁËЩʲôÄØ£¿
¡¡¡¡ÔÚÕâ֮ǰ£¬ÏȽéÉÜһϸºÔØÒò×ÓºÍÈÝÁ¿µÄÊôÐÔ¡£´ó¼Ò¶¼ÖªµÀÆäʵһ¸ö HashMap µÄʵ¼ÊÈÝÁ¿¾Í Òò×Ó*ÈÝÁ¿£¬ÆäĬÈÏÖµÊÇ 16¡Á0.75£½12£» Õâ¸öºÜÖØÒª£¬¶ÔЧÂʺÜÒ»¶¨Ó°Ï죡µ±´æÈëHashMapµÄ¶ÔÏ󳬹ýÕâ¸öÈÝÁ¿Ê±£¬HashMap ¾Í»áÖØй¹Ôì´æÈ¡±í¡£Õâ¾ÍÊÇÒ»¸ö´óÎÊÌ⣬ÎÒºóÃæÂýÂý½éÉÜ£¬·´Õý£¬Èç¹ûÄãÒѾ֪µÀÄã´ó¸ÅÒª´æ·Å¶àÉÙ¸ö¶ÔÏó£¬×îºÃÉèΪ¸Ãʵ¼ÊÈÝÁ¿µÄÄܽÓÊܵÄÊý×Ö¡£
¡¡¡¡Á½¸ö¹Ø¼üµÄ·½·¨£¬putºÍget£º
¡¡¡¡ÏÈÓÐÕâÑùÒ»¸ö¸ÅÄHashMapÊÇÉùÃ÷ÁË Map£¬Cloneable, Serializable ½Ó¿Ú£¬ºÍ¼Ì³ÐÁË AbstractMap À࣬ÀïÃæµÄ Iterator ÆäʵÖ÷Òª¶¼ÊÇÆäÄÚ²¿ÀàHashIterator ºÍÆäËû¼¸¸ö iterator ÀàʵÏÖ£¬µ±È»»¹ÓÐÒ»¸öºÜÖØÒªµÄ¼Ì³ÐÁËMap.Entry µÄ Entry ÄÚ²¿À࣬ÓÉÓÚ´ó¼Ò¶¼ÓÐÔ´´úÂ룬´ó¼ÒÓÐÐËȤ¿ÉÒÔ¿´¿´Õⲿ·Ö£¬ÎÒÖ÷ÒªÏë˵Ã÷µÄÊÇ Entry ÄÚ²¿Àà¡£Ëü°üº¬ÁËhash£¬value£¬key ºÍnext ÕâËĸöÊôÐÔ£¬ºÜÖØÒª¡£putµÄÔ´ÂëÈçÏÂ
¡¡¡¡public Object put(Object key, Object value) {
¡¡¡¡Object k = maskNull(key);
¡¡¡¡Õâ¸ö¾ÍÊÇÅжϼüÖµÊÇ·ñΪ¿Õ£¬²¢²»ºÜÉî°Â£¬ÆäʵÈç¹ûΪ¿Õ£¬Ëü»á·µ»ØÒ»¸östatic Object ×÷Ϊ¼üÖµ£¬Õâ¾ÍÊÇΪʲôHashMapÔÊÐí¿Õ¼üÖµµÄÔÒò¡£
¡¡¡¡int hash = hash(k);
¡¡¡¡int i = indexFor(hash, table.length);
¡¡¡¡ÕâÁ¬ÐøµÄÁ½²½¾ÍÊÇ HashMap ×îÅ£µÄµØ·½£¡Ñо¿ÍêÎÒ¶¼º¹ÑÕÁË£¬ÆäÖÐ hash ¾ÍÊÇͨ¹ý key Õâ¸öObjectµÄ hashcode ½øÐÐ hash£¬È»ºóͨ¹ý indexFor »ñµÃÔÚObject tableµÄË÷ÒýÖµ¡£
¡¡¡¡table£¿£¿£¿²»Òª¾ªÑÈ£¬ÆäʵHashMapÒ²Éñ²»µ½ÄÄÀïÈ¥£¬Ëü¾ÍÊÇÓà table À´·ÅµÄ¡£×îÅ£µÄ¾ÍÊÇÓà hash ÄÜÕýÈ·µÄ·µ»ØË÷Òý¡£ÆäÖеÄhashËã·¨£¬ÎÒ¸úJDKµÄ×÷Õß Doug ÁªÏµ¹ý£¬Ëû½¨ÒéÎÒ¿´¿´¡¶The art of programing vol3¡·¿ÉºÞµÄÊÇ£¬ÎÒ֮ǰ¾ÍÒ»Ö±ÔÚÕÒ£¬ÎÒ¶¼ÕÒ²»µ½£¬ËûÕâÑùÒ»ÌᣬÎҾ͸ü¼Ó¼±ÁË£¬¿Éϧ¿Ú´ü¿Õ¿Õ°¡£¡£¡£¡
¡¡¡¡²»ÖªµÀ´ó¼ÒÓÐûÓÐÁôÒâ put ÆäʵÊÇÒ»¸öÓзµ»ØµÄ·½·¨£¬Ëü»á°ÑÏàͬ¼üÖµµÄ put ¸²¸Çµô²¢·µ»Ø¾ÉµÄÖµ£¡ÈçÏ·½·¨³¹µ×˵Ã÷ÁË HashMap µÄ½á¹¹£¬Æäʵ¾ÍÊÇÒ»¸ö±í¼ÓÉÏÔÚÏàӦλÖõÄEntryµÄÁ´±í£º
for (Entry e = table[i]; e != null; e = e.next) {
¡¡if (e.hash == hash && eq(k, e.key)) {
¡¡¡¡Object oldvalue = e.value;
¡¡¡¡e.value = value; //°ÑеÄÖµ¸³Óè¸ø¶ÔÓ¦¼üÖµ¡£
¡¡¡¡e.recordAccess(this); //¿Õ·½·¨£¬Áô´ýʵÏÖ
¡¡¡¡return oldvalue; //·µ»ØÏàͬ¼üÖµµÄ¶ÔÓ¦µÄ¾ÉµÄÖµ¡£
¡¡}
}
modCount++; //½á¹¹ÐÔ¸ü¸ÄµÄ´ÎÊý
addEntry(hash, k, value, i); //Ìí¼ÓÐÂÔªËØ£¬¹Ø¼üËùÔÚ£¡
return null; //ûÓÐÏàͬµÄ¼üÖµ·µ»Ø
}
¡¡¡¡ÎÒÃǰѹؼüµÄ·½·¨ÄóöÀ´·ÖÎö£º
¡¡¡¡void addEntry(int hash, Object key, Object value, int bucketIndex) {
¡¡¡¡table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]);
¡¡¡¡ÒòΪ hash µÄËã·¨ÓпÉÄÜÁͬµÄ¼üÖµÓÐÏàͬµÄhashÂë²¢ÓÐÏàͬµÄtableË÷Òý£¬È磺key£½¡°33¡±ºÍkey£½Object gµÄhash¶¼ÊÇ£8901334£¬ÄÇËü¾¹ýindexforÖ®ºóµÄË÷ÒýÒ»¶¨¶¼Îªi£¬ÕâÑùÔÚnewµÄʱºòÕâ¸öEntryµÄnext¾Í»áÖ¸ÏòÕâ¸öÔ±¾µÄtable[i]£¬ÔÙÓÐÏÂÒ»¸öÒ²Èç´Ë£¬ÐγÉÒ»¸öÁ´±í£¬ºÍputµÄÑ»·¶Ô¶¨e.next»ñµÃ¾ÉµÄÖµ¡£µ½ÕâÀHashMapµÄ½á¹¹£¬´ó¼ÒҲʮ·ÖÃ÷°×ÁË°É£¿
¡¡¡¡if (size++ >= threshold) //Õâ¸öthreshold¾ÍÊÇÄÜʵ¼ÊÈÝÄɵÄÁ¿
¡¡¡¡resize(2 * table.length); //³¬³öÕâ¸öÈÝÁ¿¾Í»á½«Object tableÖع¹
¡¡¡¡ËùνµÄÖع¹Ò²²»Éñ£¬¾ÍÊǽ¨Ò»¸öÁ½±¶´óµÄtable£¨ÎÒÔÚ±ðµÄÂÛ̳ÉÏ¿´µ½ÓÐÈË˵ÊÇÁ½±¶¼Ó1£¬°ÑÎÒÆÁË£©£¬È»ºóÔÙÒ»¸ö¸öindexfor½øÈ¥£¡×¢Ò⣡£¡Õâ¾ÍÊÇЧÂÊ£¡£¡Èç¹ûÄãÄÜÈÃÄãµÄHashMap²»ÐèÒªÖع¹ÄÇô¶à´Î£¬Ð§ÂÊ»á´ó´óÌá¸ß£¡
¡¡¡¡Ëµµ½ÕâÀïÒ²²î²»¶àÁË£¬get±Èput¼òµ¥µÃ¶à£¬´ó¼Ò£¬Á˽âput£¬getÒ²²î²»Á˶àÉÙÁË¡£¶ÔÓÚcollectionsÎÒÊÇÈÏΪ£¬ËüÊÇÊʺϹ㷺µÄ£¬µ±²»ÍêÈ«ÊʺÏÌØÓеģ¬Èç¹û´ó¼ÒµÄ³ÌÐòÐèÒªÌØÊâµÄÓÃ;£¬×Ô¼ºÐ´°É£¬ÆäʵºÜ¼òµ¥¡££¨×÷ÕßÊÇÕâÑù¸úÎÒ˵µÄ£¬Ëû»¹½¨ÒéÎÒÓÃLinkedHashMap,ÎÒ¿´ÁËÔ´ÂëÒÔºó·¢ÏÖ£¬LinkHashMapÆäʵ¾ÍÊǼ̳ÐHashMapµÄ£¬È»ºóoverrideÏàÓ¦µÄ·½·¨£¬ÓÐÐËȤµÄͬÈË£¬×Ô¼ºlooklook£©½¨¸ö Object table£¬Ð´ÏàÓ¦µÄËã·¨£¬¾ÍokÀ²¡£
¡¡¡¡¾Ù¸öÀý×Ó°É£¬Ïñ Vector£¬list °¡Ê²Ã´µÄÆäʵ¶¼ºÜ¼òµ¥£¬×î¶à¾Í¶àÁ˵Äͬ²½µÄÉùÃ÷£¬ÆäʵÈç¹ûҪʵÏÖÏñVectorÄÇÖÖ£¬²åÈ룬ɾ³ý²»¶àµÄ£¬¿ÉÒÔÓÃÒ»¸öObject tableÀ´ÊµÏÖ£¬°´Ë÷Òý´æÈ¡£¬Ìí¼ÓµÈ¡£
¡¡¡¡Èç¹û²åÈ룬ɾ³ý±È½Ï¶àµÄ£¬¿ÉÒÔ½¨Á½¸öObject table£¬È»ºóÿ¸öÔªËØÓú¬ÓÐnext½á¹¹µÄ£¬Ò»¸ötable´æ£¬Èç¹ûÒª²åÈëµ½i£¬µ«ÊÇiÒѾÓÐÔªËØ£¬ÓÃnextÁ¬ÆðÀ´£¬È»ºósize£«£«£¬²¢ÔÚÁíÒ»¸ötable¼Ç¼ÆäλÖá£