Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaÊý×éµ½HashMapÖ®Ëã·¨½âÊÍ
 
À´Ô´£ºxcafe  ·¢²¼ÓÚ 2017-2-6
  1644  次浏览      27
 

Ò»¡¢Êý×éÊÇʲô£¿

ÍüÁËÔÚÄı¾ÊéÀïÔø¿´µ½¹ýÀàËÆÕâÑùµÄÒ»¾ä»°¡°ËùÓеÄÊý¾Ý½á¹¹¶¼ÊÇÊý×éµÄÑÝ»¯¡±£¬ÏëÏëÆäʵÊÇÓеÀÀíµÄ£¬ÒòΪ¼ÆËã»úµÄÄÚ´æÆäʵ¾ÍÊÇÏßÐԵĴ洢¿Õ¼ä¡£

JavaʾÀý´úÂ룺

int[] array = new int[5]

ºöÂÔ¶ÔÏóÍ·ÐÅÏ¢ºÍÊý×鳤¶ÈÐÅÏ¢£¬JVMÖ´ÐÐʱ»áÔÚ¶ÑÖзÖÅä20¸ö×Ö½ÚµÄÄÚ´æ¿Õ¼ä£¬¿´ÆðÀ´¾ÍÊÇÕâÑùµÄ£º

ÕâÑùµÄÊý¾Ý½á¹¹¿ÉÒԺܷ½±ãµØÍ¨¹ýÊý×éÏÂ±ê´æÈ¡Êý¾Ý£¬µ«ÔÚ²éÕÒʱÐèÒª±éÀúÊý×飬ƽ¾ùʱ¼ä¸´ÔÓ¶ÈΪO(n/2)¡£

µ±Êý¾ÝÁ¿ºÜ´ó»òÕß²éÕÒ²Ù×÷Ƶ·±µÄʱºò£¬ÕâÑùµÄ±éÀú²Ù×÷¼¸ºõÊDz»¿É½ÓÊܵġ£ÄÇô£¬ÈçºÎ²ÅÄܹ»ÔÚ¸ü¶ÌµÄʱ¼äÄÚ¿ìËÙÕÒµ½Êý¾ÝÄØ£¿

¶þ¡¢¶þ·Ö²éÕÒ

¼ÙÈçÊý×éÄÚµÄÔªËØÊÇÒѾ­ÅÅÐòµÄ£¬ÄÇôºÜ×ÔÈ»µÄ·½Ê½¾ÍÊÇʹÓöþ·Ö²éÕÒ¡£

Æ©ÈçÓÐÒ»¸öÕûÐÎÊý×éµÄ³¤¶ÈΪ1000£¬Êý×éÄÚµÄÕûÊý´ÓСµ½´óÅÅÁУ¬Èç¹ûÎÒÏëÒªÖªµÀ6000ÊÇ·ñÔÚ´ËÊý×éÖС£ÄÇôÎÒ¿ÉÒÔÏȲ鿴array[500]µÄÊý×ÖÊÇ·ñΪ6000£¬array[500]µÄÊý×Ö±È6000С£¬ÄÇô¾Í²é¿´array[750]λÖõÄÊý×Ö¡­¡­ÒÀ´ÎÀàÍÆ£¬ÄÇô×î¶à¾­¹ý10´Î£¬¾Í¿ÉÒÔÈ·¶¨½á¹û¡£

´ËËã·¨µÄʱ¼ä¸´ÔÓ¶ÈΪO(logN)¡£

È»¶ø£¬´ó²¿·ÖÇé¿öÏÂÊý×éÔªËØ¶¼ÊÇÎÞÐòµÄ£¬¶øÅÅÐòËùÐèÒªµÄʱ¼ä¸´ÔÓ¶ÈO(NlogN)ͨ³£¶¼Ô¶Ô¶³¬¹ý±éÀúËùÐèÒªµÄʱ¼ä¡£

ÄÇô£¬ÎÊÌâÓֻص½ÁËÔ­µã¡£¸ÃÈçºÎÔÚÎÞÐòµÄÊý¾ÝÖпìËÙÕÒµ½Êý¾ÝÄØ£¿

Èý¡¢ã¶®µÄ˼¿¼

»¹¼ÇµÃ¸Õѧ±à³Ì²»¾Ãʱ¿´¡¶±à³ÌÖéçá¡·£¬ÆäÖÐÓÐÒ»¶ÎÃèÊö£º20ÊÀ¼Í70Äê´ú£¬Mike LeskΪµç»°¹«Ë¾×öÁ˵绰ºÅÂë²éÕÒ¹¦ÄÜ£¬Æ©ÈçÊäÈëLESK*M*¶ÔÓ¦µÄÊý×Ö¼ü5375*6*£¬¿ÉÒÔ·µ»ØÕýÈ·µÄµç»°ºÅÂë»ò¿ÉÑ¡ÁÐ±í£¬´íÎóÆ¥ÅäÂʽö0.2%¡£

Ôõô²ÅÄÜ×öµ½£¿

µ±Ê±ÎÒ»¹ÍêÈ«²»Á˽âÊý¾Ý½á¹¹ºÍËã·¨£¬»¹Ô­Ïµ±Ê±ÌìÂíÐпÕ˼¿¼µÄ¹ý³Ì£¬ÏÖÔÚ¿´ÆðÀ´ÈÔÈ»ÊǺÜÓÐÒâ˼µÄ¡£

1¡¢¼Ó·¨

ËùÓÐÊý×ÖÏà¼Ó(*¼üΪ11)£¬5375*6*µÄºÍΪ48¡£´ó¶àÊýÊäÈëµÄºÍ²»³¬¹ý100£¬Òâζ׿¸Íò¸öµç»°ºÅÂë¶¼»á¾Û¼¯ÔÚÊý×éǰ100µÄλÖã¬ËùÒÔÊDz»¿ÉÐеġ£

2¡¢³Ë·¨

ËùÓÐÊý×ÖÏà³Ë£¬»ýΪ381150¡£ÕâËÆºõÊÇ¿ÉÐе쬵«³öÏÖÁËÕâÑùµÄÎÊÌ⣺lesk¡¢lsek¡¢slke¡­¡­µÄ»ýÊÇÒ»ÑùµÄ£¬Ã¿Ò»¸öÊý×Ö¼ü»¹¶ÔÓ¦×Å3¸ö×Öĸ£¬Òâζ×ÅÖØ¸´µÄ¸ÅÂÊ»áºÜ¸ß¡£

3¡¢¸Ä½øºóµÄ³Ë·¨

¢Ù×ÖĸÏàͬµ«×ÖĸÐò²»Í¬µÄ×Ö·û´®£¬¿ÉÒÔͨ¹ýÕâÑùµÄ·½Ê½À´±ÜÃâ³åÍ»£ºÃ¿Ò»¸öÊý×ÖÏȳËÒÔÐòºÅ£¬È»ºóÔÙÓëÆäËüÖµÏà³Ë¡£

¢Úÿһ¸öÊý×Ö¼ü¶ÔÓ¦ÁË3¸öÓ¢ÎÄ×Öĸ£¬Èç¹ûÓû§Ã»ÓÐÊäÈë×ÖĸÔÚÊý×Ö¼üÖеÄÐòºÅ£¬ÊÇû°ì·¨ÔÙ½øÒ»²½¾«È·¼ÆËãµÄ¡£ÄÜ¿¼Âǵķ½ÏòÖ»ÄÜÊǸù¾Ý¸ø¶¨µÄµ¥´Ê±íÀ´×ö¸ÅÂÊͳ¼Æ£¬ËùÒÔ²»Ó迼ÂÇ¡£

4¡¢Î»ÖóåÍ»

¼´Ê¹ÓøĽøºóµÄ³Ë·¨£¬²»Í¬µÄÐÕÃû×Öĸ¼ÆËãµÃ³öµÄ»ýÒÀÈ»»¹ÊÇ¿ÉÄܻᷢÉúÖØ¸´£¬ÄÇôµ±·¢Éú³åÍ»ºóÓ¦¸ÃÔõô°ì£¿

˳Ðò±£´æµ½ÏÂÒ»¸ö¿Õ°×λÖã¿×ÐϸÏëÏëÕâÊÇÐв»Í¨µÄ¡£Èç¹ûÏÂÒ»¸ö¿Õ°×λÖøպÃÓÖÊÇÁíÍâµÄ×Öĸ¼¯ºÏµÄ»ý£¬ÄǾͲúÉúÁ˶þ´Î³åÍ»¡£

ÐҺ㬻¹ÓÐÖÊÊý¡£

ÖÊÊýÖ»Äܱ»1ºÍ×ÔÉíÕû³ý£¬ÄÇôÉÏÊö³Ë·¨µÃ³öµÄÈκλý¶¼²»¿ÉÄÜÊÇÖÊÊý£¬ËùÒÔÖÊÊýλÖÃÊÇûÓб£´æµç»°ºÅÂëµÄ¡£

Òò´Ë£¬ÒÔµ±Ç°»ýΪÆðµãÏòÓÒËÑË÷ÏÂÒ»¸öÖÊÊý£¬Èç¹û¸ÃÖÊÊýλÖÃÒÀÈ»±»Ê¹Óã¬ÄÇô¾Í¼ÌÐø²éÕÒÏÂÒ»¸ö×î½üµÄÖÊÊý¡­¡­

ÖÁ´Ë£¬ÎÊÌâËÆºõÊǽâ¾öÁË¡£

Óû§ÊäÈëÒ»´®Êý×Ö£¬¸ù¾Ý¹«Ê½¼ÆËãµÃµ½»ý£¬·µ»Ø¸ÃϱêλÖõĵ绰ºÅÂë¡£Èç¹û²»ÕýÈ·£¬ÔÙ˳Ðò²éÕÒºóÃæµÄÖÊÊý£¬Ö±µ½Ä³¸öÖÊÊýϱêµÄÊý×éÔªËØÎª¿ÕΪֹ£¬×îºó·µ»ØËùÓвéÕÒµ½µÄµç»°ºÅÂë¡£´ó²¿·ÖÇé¿öÏ£¬Ö»ÐèÒªO(1)µÄʱ¼ä¸´ÔӶȾͿÉÒÔÕÒµ½µç»°ºÅÂë¡£

5¡¢Êý×éÌ«´ó

ΨһµÄÎÊÌâÊÇ£¬°´ÕÕÉÏÊö˼·½¨Á¢µÄÊý×éʵÔÚÊÇÌ«´óÁË¡£Ò»¸öÐÕÃûÓÐ10¸ö×Öĸ£¬¼ÙÈçÿһ¸ö×Öĸ¶ÔÓ¦µÄÊý×Ö¶¼ÊÇ9£¬×îºóµÃµ½µÄ»ýÔ¼ÊÇ9µÄ17´Î·½¡£ÕâÒâζ×ÅÒª½¨Á¢9^17´óСµÄÊý×飬ÕâÊÇÍêÈ«²»¿ÉÐеġ£

6¡¢ºóÀ´

¼´Ê¹²»¿¼ÂÇÊý×é¹ý´óÒòËØ£¬ÒÔÎÒµ±Ê±³õѧ±à³ÌµÄˮƽ£¬ÕâÑùµÄ³ÌÐòÒ²ÊÇûÓÐÄÜÁ¦Ð´³öÀ´µÄ¡£

ÎÒÖ®ËùÒÔ»¹Ô­Õâ¸ö˼¿¼µÄ¹ý³Ì£¬ÊǾõµÃ¶ÀÁ¢Ë¼¿¼µÄ¹ý³Ì·Ç³£ÓÐȤҲºÜÓмÛÖµ¡£ÏëÏ룬ÆäʵÏÖÓеÄËã·¨¶¼Êǵ±ÄêÄÇЩ´óÅ£ÔÚʵ¼Ê¹¤³ÌÖÐÒ»²½Ò»²½Ñ°Çó½â¾ö·½°¸¶ø×îÖÕÍÆµ¼µÃµ½µÄ¡£

Òò´Ë£¬µ±ÔÚ¹¤³ÌÖÐÅöµ½Ò»Ð©¼¬ÊÖµÄÄÑÌâʱ£¬Ö»ÒªÀÖÓÚ˼¿¼·Ö½âÎÊÌⲢѰÇóÿһ¸öСÎÊÌâ½â¾ö·½°¸£¬ÄÇôºÜ¶àËùνµÄÄÑÌâ¶¼ÊÇ¿ÉÒÔ½â¾öµÄ¡£

ºóÀ´¿´ÁË¡¶Êý¾Ý½á¹¹ÓëËã·¨·ÖÎö.JavaÓïÑÔÃèÊö¡·£¬ÎÒ²ÅÖªµÀÔ­À´ÎÒµÄ˼·Æäʵ¾ÍÊÇ¿ª·ÅѰַ·¨£¨Open Addressing£©¡£

JDKµÄHashMapʹÓõÄÔòÊÇ·ÖÀëÁ´½Ó·¨(separate chaining)¡£²»Í¬£ºÔö¼ÓÁËͰµÄ¸ÅÄîÀ´±£´æ³åÍ»µÄÊý¾Ý£»½øÐÐÇóÓàÔËËãÀ´½µµÍÊý×é´óС¡£

ÄÇô£¬¾Í̸̸JavaÖеÄHashMap°É¡£

ËÄ¡¢HashMap½á¹¹¼°Ëã·¨Ïê½â

HashMapµÄ±¾ÖÊÒÀÈ»ÊÇÊý×飬¶øÇÒÊÇÒ»¸ö²»¶¨³¤µÄ¶àάÊý×飬½üËÆÓÚÏÂͼÕâÑùµÄ½á¹¹£º

1¡¢¼òµ¥½éÉÜ

HashMapÖеÄÊý×é±£´æÁ´±íµÄÍ·½Úµã¡£

±£´æÊý¾Ý£º

¼ÆËãkeyµÄhashCode£¬ÔÙÓëÊý×鳤¶È½øÐÐÇóÓàÔËËãµÃµ½Êý×éϱê(Á´±íÍ·½Úµã)¡£

Èç¹û¸ÃλÖÃΪ¿Õ£¬Éú³ÉÒ»¸öеÄÁ´±í½Úµã²¢±£´æµ½¸ÃÊý×é¡£

Èç¹û¸ÃλÖ÷ǿգ¬Ñ­»·±È¶ÔÁ´±íµÄÿһ¸ö½Úµã£ºÒѾ­´æÔÚkeyÏàͬµÄ½Úµã£¬¸²¸Ç¾É½Úµã£»²»´æÔÚkeyÏàͬµÄ½Úµã£¬½«Ð½ڵã×÷ΪÁ´±íµÄβ½Úµã£¨×¢£º²é¿´JDK1.8ÖеÄÔ´Â룬нڵã×ÜÊǼÓÈëµ½Á´±íĩ⣬¶ø²»ÊÇÈçJDK1.6Ò»°ã×÷ΪÁ´±íÍ·½Úµã£©¡£

²éÕÒÊý¾Ý£º

¼ÆËãkeyµÄhashCode£¬ÔÙÓëÊý×鳤¶È½øÐÐÇóÓàÔËËãµÃµ½Êý×éϱê(Á´±íÍ·½Úµã)¡£Èç¹ûÁ´±í²»Îª¿Õ£¬ÏȱȶÔÊ׽ڵ㣬Èç¹ûÊ×½ÚµãkeyÏàͬ£¨hashCodeÏàͬÇÒequalsΪtrue£©£¬Ö±½Ó·µ»ØÊ×½ÚµãµÄvalue£»Ê×½Úµãkey²»Í¬Ôò˳Ðò±éÀú±È¶ÔÁ´±íÆäËü½Úµã£¬·µ»ØkeyÏàͬµÄ½ÚµãµÄvalue£¨Î´ÕÒµ½keyÏàͬµÄ½ÚµãÔò·µ»Ønull£©¡£

HashMapÒýÈëÁ´±íµÄÄ¿µÄ¾ÍÊÇΪÁ˽â¾öÉÏÒ»½ÚÌÖÂÛ¹ýµÄÖØ¸´³åÍ»ÎÊÌâ¡£

×¢ÒâÊÂÏ

Èç¹ûËùÓÐkeyµÄhashcodeÏàͬ£¬¼Ù¶¨¾ùΪ0£¬Ôò0%4 = 0£¬ËùÓÐÔªËØ¾Í»á¶¼±£´æµ½Á´±í0£¬±£´æºÍ²éÕÒÿһ¸öÊý¾Ý¶¼ÐèÒª±éÀúÁ´±í0¡£ÄÇô£¬´ËʱµÄHashMapʵÖÊÉÏÒѾ­ÍË»¯³ÉÁËÁ´±í£¬Ê±¼ä¸´ÔÓ¶ÈÒ²´ÓÉè¼ÆµÄO(1)ÉÏÉýµ½ÁËO(n/2)¡£

ΪÁ˾¡¿ÉÄܵØÈÃHashMapµÄ²éÕҺͱ£´æµÄʱ¼ä¸´ÔӶȱ£³ÖÔÚO(1),¾ÍÐèÒªÈÃÔªËØ¾ùÔȵطֲ¼ÔÚÿһ¸öÁ´±í£¬Ò²¾ÍÊÇÿһ¸öÁ´±íÖ»±£´æÒ»¸öÔªËØ¡£

ÄÇôӰÏìÒòËØÓÐÄÄЩ£¿

Ò»ÊÇkeyµÄhashcode²»ÄÜÖØ¸´£¬Èç¹ûÖØ¸´¾Í¿Ï¶¨»áÓÐÁ´±í±£´æÖÁÉÙ2¸öÔªËØ£»

¶þÊǹþÏ£º¯ÊýÉè¼Æ£¬Èç¹ûÖ»ÊǼòµ¥µÄÇóÓ࣬ÄÇôÓàÊý»áÓдóÁ¿Öظ´£»

ÈýÊÇÁ´±íµÄ´óС£¬Èç¹û100¸öÔªËØÒª·Ö²¼ÔÚ³¤¶ÈΪ10µÄÊý×飬ÎÞÂÛÔõô¼ÆËã¶¼»áµ¼ÖÂÆäÖÐÓÐÁ´±í±£´æ¶à¸öÔªËØ£¬×îºÃµÄÇé¿öÊÇÿ¸öÁ´±í±£´æ10¸ö£»

ÏÂÃæ·Ö±ðÏêϸ½éÉÜÕâÈý¸öÒòËØµÄËã·¨Éè¼Æ¡£

2¡¢hashcodeÉú³É

ÕâÊÇStringÀàµÄhashCodeÉú³É´úÂë¡£

public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

StringÀàµÄvalueÊÇchar[]£¬char¿ÉÒÔת»»³ÉUTF-8±àÂ롣ƩÈ磬¡¯a¡¯¡¢¡¯b¡¯¡¢¡¯c¡¯µÄUTF-8±àÂë·Ö±ðÊÇ97,98,99£»¡°abc¡±¸ù¾ÝÉÏÃæµÄ´úÂëת»»³É¹«Ê½¾ÍÊÇ£º

h = 31 * 0 + 97 = 97£»

h = 31 * 97 + 98 = 3105£»

h = 31 * 3105 + 99 = 96354£»

ʹÓÃ31×÷Ϊ³ËÊýÒò×ÓÊÇÒòΪËüÊÇÒ»¸ö±È½ÏºÏÊÊ´óСµÄÖÊÊý£ºÈçÖµ¹ýС£¬µ±²ÎÓë¼ÆËãhashcodeµÄÏîÊý½ÏÉÙʱ»áµ¼Ö»ý¹ýС£»ÈçΪżÊý£¬ÔòÏ൱ÓÚÊÇ×óÎ»ÒÆ£¬µ±³Ë·¨Òç³öʱ»áÔì³ÉÓйæÂɵÄλÐÅÏ¢¶ªÊ§¡£¶øÕâÁ½Õß¶¼»áµ¼ÖÂÖØ¸´ÂÊÔö¼Ó¡£

Èç¹ûʹÓÃ32×÷Ϊ³ËÊýÒò×Ó(Ï൱ÓÚ << 5)£¬ÒÔ×Ö·û´®¡°abcabcabcabcabc¡±ÎªÀý£¬ËüµÄhashcodeµÄÿһ²½¼ÆËã½á¹ûÈçÏÂͼ£º

ÈçÉÏͼËùʾ£¬×Ö·û´®Ä©Î²Ã¿3¸ö×Öĸ¾Í»á²úÉúÒ»¸öÖØ¸´µÄhashcode¡£Õâ²¢²»ÊÇÒ»¸öÇɺϣ¬¼´Ê¹»»³ÉÆäËüµÄÓ¢ÎÄ×Öĸ£¬Ò²ÓкÜÈÝÒײúÉúÖØ¸´£¬¶øÊ¹ÓÃÖÊÊýÔò»á´ó´óµØ¼õÉÙÖØ¸´¿ÉÄÜÐÔ¡£ÓÐÐËȤµÄ¿ÉÒÔ²ÎÕÕÉÏͼȥ×÷Ò»ÏÂ×óÎ»ÒÆÔËË㣬»á·¢ÏÖÕâ²¢²»ÊÇżȻ¡£

¡¶Effective Java¡·Ò»ÊéÖÐÏêϸÃèÊöÁËhashcodeµÄÉú³É¹æÔòºÍ×¢ÒâÊÂÏÓÐÐËȤµÄ¿ÉÒÔÈ¥¿´¿´¡£

´ÓÔ´´úÂëµÄhashCode()·½·¨¿ÉÖª£¬StringÀà¶ÔÏó±£´æÁËÒѾ­¼ÆËãºÃµÄhashCode£¬Èç¹ûÒѾ­µ÷ÓùýhashCode()·½·¨£¬ÄÇôµÚ¶þ´Îµ÷ÓÃʱ²»»áÔÙÖØÐÂÉú³É£¬¶øÊÇÖ±½Ó·µ»ØÒѾ­¼ÆËãºÃµÄhashCode¡£

String¶ÔÏó×ÜÊÇ»á´æ·Åµ½StringÀà˽ÓÐά»¤µÄ³£Á¿³ØÖУ¬²»ÏÔʽʹÓÃnew¹Ø¼ü×Öʱ£¬Èç¹û³£Á¿³ØÖÐÒѾ­ÓÐvalueÏàͬµÄ¶ÔÏó£¬ÄÇô×ÜÊǻ᷵»ØÒÑÓжÔÏóµÄÒýÓá£Òò´Ë£¬ºÜ¶àÇé¿öÏÂÉú³ÉhashCodeÕâÖֱȽϰº¹óµÄ²Ù×÷ʵ¼ÊÉϲ¢²»ÐèÒªÖ´ÐС£

3¡¢¹þÏ£º¯ÊýÉè¼Æ

ÏÖÔÚ£¬ÒѾ­µÃµ½ÁËÖØ¸´Âʺܵ͵ÄhashCode£¬»¹ÓÐʲôÃÀÖв»×ãµÄµØ·½Âð£¿

ÈŶ¯º¯Êý

static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

ÏÂͼ»¹ÊÇÒÔ×Ö·û´®¡°abcabcabcabcabc¡±ÎªÀý£¬Ê¹ÓÃÉÏÃæ·½·¨µÃµ½µÄÔËËã¹ý³ÌºÍ½á¹û¡£

ΪʲôҪÏÈÎÞ·ûºÅÓÒÎ»ÒÆ16λ£¬È»ºóÔÙÖ´ÐÐÒì»òÔËË㣿¿´¿´ÏÂͼµÄ¶þ½øÖƵÄÓëÔËË㣬Äã¾Í»áÃ÷°×¡£

Äã»á·¢ÏÖÖ»Òª¶þ½øÖÆÊýºó4λ²»±ä£¬Ç°ÃæµÄ¶þ½øÖÆÎ»ÎÞÂÛÈçºÎ±ä»¯¶¼»á³öÏÖÏàͬµÄ½á¹û¡£ÎªÁË·ÀÖ¹³öÏÖÕâÖÖ¸ßλ±ä»¯¶øµÍλ²»±äµ¼ÖµÄÔËËã½á¹ûÏàͬµÄÇé¿ö£¬Òò´ËÐèÒª½«¸ßλµÄ±ä»¯Ò²¼ÓÈë½øÀ´£¬¶ø½«ÕûÊýµÄ¶þ½øÖÆÎ»Éϰ벿Óëϰ벿½øÐÐÒì»ò²Ù×÷¾Í¿ÉÒԵõ½Õâ¸öЧ¹û¡£

ΪʲôҪʹÓÃÓëÔËË㣿

ÒòΪ¹þÏ£º¯ÊýµÄ¼ÆË㹫ʽ¾ÍÊÇhashCode % tableSize£¬µ±tableSizeÊÇ2µÄn´Î·½(n¡Ý1)µÄʱºò£¬µÈ¼ÛÓÚhashCode & (tableSize ¨C 1)¡£

ÈŶ¯º¯ÊýÓÅ»¯Ç°£º1954974080 % 16 = 1954974080 & (16 ¨C 1) = 0

ÈŶ¯º¯ÊýÓÅ»¯ºó£º1955003654 % 16 = 1955003654 & (16 ¨C 1) = 6

Õâ¾ÍÊÇΪʲôÐèÒªÔö¼ÓÈŶ¯º¯ÊýµÄÔ­Òò¡£

Ô´´úÂëÏê½â

´úÂë½âÊÍ֮ǰÐèÒª²¹³ä˵Ã÷һϣ¬jdk1.8ÒýÈëÁ˺ìºÚÊ÷À´½â¾ö´óÁ¿³åͻʱµÄ²éÕÒЧÂÊ£¬ËùÒÔµ±Ò»¸öÁ´±íÖеÄÊý¾Ý´óµ½Ò»¶¨¹æÄ£µÄʱºò£¬Á´±í»áת»»³ÉºìºÚÊ÷¡£Òò´ËÔÚjdk1.8ÖУ¬HashMapµÄ²éÕҺͱ£´æÊý¾ÝµÄ×î´óʱ¼ä¸´ÔÓ¶Èʵ¼ÊÉϾÍÊǺìºÚÊ÷µÄʱ¼ä¸´ÔÓ¶ÈO(logN)¡£

ÒÔÏÂÊÇHashMapÖеı£´æÊý¾ÝµÄ·½·¨Ô´´úÂ룬ÏàО­¹ýÒÔÉϵÄÃèÊö£¬ÒѾ­·Ç³£ÈÝÒ׿´¶®ÕâÒ»¶Î´úÂë¡£

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
Node<K,V>[] tab;//HashMapÊý×é
Node<K,V> p;//³õʼ»¯ÐèÒª±£´æµÄÊý¾Ý
int n;¡¡//Êý×éÈÝÁ¿
int i;¡¡//Êý×éϱê

/* Èç¹ûÊý×éΪ¿Õ»ò0£¬³õʼ»¯ÈÝÁ¿Îª16 */
if ((tab = table) == null || (n = tab.length) == 0){
n = (tab = resize()).length;
}

/* ʹÓùþÏ£º¯Êý»ñÈ¡Êý×éλÖÃ(Èç¹ûΪ¿Õ£¬±£´æÐ½ڵ㵽Êý×é) */
if ((p = tab[i = (n - 1) & hash]) == null){
tab[i] = newNode(hash, key, value, null);
}

/* Èç¹ûÊý×éλÖÃÒѾ­ÓÐÖµ£¬ÔòʹÓÃÏÂÁз½Ê½±£´æÊý¾Ý */
else {
Node<K,V> e;//ÁÙʱ½Úµã±£´æÐÂÖµ
K k;//ÁÙʱ±äÁ¿ÓÃÓڱȽÏkey

//Èç¹ûÍ·½ÚµãÓëнڵãµÄkeyµÄhashÖµÏàͬ ÇÒ keyµÄÖµÏàµÈ£¬e¸³ÖµÎª¾É½Úµã
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))){
e = p;
}

//Èç¹ûÍ·½ÚµãÊÇÒ»¸öºìºÚÊ÷½Úµã£¬ÄÇôe½«±£´æÎªÊ÷½Úµã
else if (p instanceof TreeNode){
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
}

//Èç¹ûÍ·½ÚµãÓëнڵ㲻ͬ£¬ÇÒÍ·½Úµã²»ÊǺìºÚÊ÷½Úµã£¬Ñ­»·±È¶ÔÁ´±íµÄËùÓнڵã
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
//Èç¹ûÖ±µ½Á´±íβδÕÒµ½ÏàͬkeyµÄ½Úµã£¬½«Ð½áµã×÷Ϊ×îºóÒ»¸ö½Úµã¼ÓÈëµ½Á´±í
p.next = newNode(hash, key, value, null);

//Èç¹ûÁ´±í½ÚµãÊý´óÓÚµÈÓÚ8-1£¬×ª»»³ÉºìºÚÊ÷£»×ª»»³ÉºìºÚÊ÷µÄ×îС½ÚµãÊýÊÇ8
if (binCount >= TREEIFY_THRESHOLD - 1){
treeifyBin(tab, hash);
}
break;
}
//Èç¹ûÑ­»·¹ý³ÌÖз¢ÏÖоÉkeyµÄÖµÏàͬ£¬Ìø×ª£ºÊÇ·ñ¸²¸Ç¾ÉÖµ
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))){
break;
}
p = e;
}
}

//ÊÇ·ñ¸²¸Ç¾ÉÖµ
if (e != null) {
V oldValue = e.value;
//Èç¹ûÐÂÖµ²»Îª¿ÕÇÒ£¨ÔÊÐíÐ޸ľÉÖµ »ò ¾ÉֵΪ¿Õ£©£¬¸²¸Ç¾É½ÚµãµÄÖµ
if (!onlyIfAbsent || oldValue == null){
e.value = value;
}
afterNodeAccess(e);//»Øµ÷º¯Êý£¬ÕâÀïÊǿպ¯Êý£¬µ«ÔÚlinkedHashMapÖÐʵÏÖÁË´Ë·½·¨
return oldValue;//·µ»Ø¾ÉÖµ
}
}

//ÓÃÓڱȽÏÅжÏÊÇ·ñÔÚ±éÀú¼¯ºÏ¹ý³ÌÖÐÓÐÆäËüÏß³ÌÐ޸ļ¯ºÏ£¬ÏêÇéÇëÍøÉÏËÑË÷fail-fast¿ìËÙʧ°Ü»úÖÆ
++modCount;

//µ±keyÊýÁ¿´óÓÚÔÊÐíÈÝÁ¿Ê±½øÐÐÀ©ÈÝ¡£ÔÊÐíÈÝÁ¿ÔÚHashMapÖÐÊÇÊý×鳤¶È * ×°ÌîÒò×Ó(ĬÈÏ0.75)
if (++size > threshold){
resize();
}

//»Øµ÷º¯Êý£¬ÕâÀïÊǿպ¯Êý£¬µ«ÔÚlinkedHashMapÖÐʵÏÖÁË´Ë·½·¨
afterNodeInsertion(evict);
return null;
}

¼ò»¯ºóµÄα´úÂë

putval(key, value){
index = key.hashcode % tablesize;
if(null == table[index]){
table[index] = new node(key, value);
}else{
firstNode = table[index];
nextNode = firstNode.next;
while(nextNode.hasNextNode()){
//Èç¹ûÕÒµ½ÏàͬkeyµÄ¾É½Úµã£¬¸²¸Ç¾É½Úµã
if(key == nextNode.key){
nextNode = new node(key, value);
break;
}
//Èç¹ûµ½¶ÓÁÐĩβÒÀȻûÓÐÕÒµ½ÏàͬkeyµÄ¾É½Úµã£¬
½«Ð½áµã¼ÓÈëµ½×îºóÒ»¸ö½ÚµãµÄĩβ
if(nextNode.next == null){
nextNode.next = new node(key, value);
break;
}
nextNode = nextNode.next;
}
}
}

Á´±í´óСÉè¼Æ

´úÂë×¢ÊÍÖÐÒѾ­ÉÔÓÐÌá¼°£¬ÕâÀïÔÙ·Ö±ðÕ¹¿ªÌÖÂÛ¡£

¢ÙÈÝÁ¿Ñ¡Ôñ

HashMapµÄ³õʼÈÝÁ¿ÊÇ 1 << 4£¬Ò²¾ÍÊÇ16¡£ÒÔºóÿ´ÎÀ©Èݶ¼ÊÇsize << 1£¬Ò²¾ÍÊÇÀ©ÈݳÉÔ­À´ÈÝÁ¿µÄ2±¶¡£Èç´ËÉè¼ÆÊÇÒòΪ 2^n-1(n¡Ý1)µÄ¶þ½øÖƱíʾ×ÜÊÇÎªÖØ¸´µÄ1£¬·½±ã½øÐÐÇóÓàÔËËã¡£

¡¶Êý¾Ý½á¹¹ÓëËã·¨·ÖÎö.JavaÓïÑÔÃèÊö¡·Ò»ÊéÖеĽ¨ÒéÊÇÈÝÁ¿×îºÃÊÇÖÊÊý£¬ÓÐÖúÓÚ½µµÍ³åÍ»£¬µ«Ã»Óиø³öÖ¤Ã÷»òʵÑéÊý¾Ý¡£

ÖÊÊýËäÈ»ÊÇÉñÆæµÄÊý×Ö£¬µ«¸öÈ˸оõÔÚÕâÀﲢûÓÐÌØ±ðµÄÓô¦¡£

¸ù¾Ý¹«Ê½index = hashCode % size¿ÉÖª£¬ÎÞÂÛsizeÊÇÖÊÊý»¹ÊÇ·ÇÖÊÊý£¬indexµÄÖµÇø¼ä¶¼ÊÇ0ÖÁ(size-1)Ö®¼ä£¬ËƺõÕæÕýÆð¾ö¶¨×÷ÓõÄÊÇhashCodeµÄËæ»úÐÔÒªºÃ¡£

ÕâÀïÏȲ»Ï½áÂÛ£¬´ýÒÔºóÔÙдһ¸öËæ»úº¯Êý±È½ÏÏÂÖÊÊýºÍ·ÇÖÊÊýÖØ¸´ÂÊ¡£

¢Ú×°ÌîÒò×Ó

×°ÌîÒò×ÓĬÈÏÊÇ0.75£¬Ò²¾ÍÊÇ˵Èç¹ûÊý×éÈÝÁ¿Îª16£¬ÄÇôµ±keyµÄÊýÁ¿´óÓÚ12ʱ£¬HashMap»á½øÐÐÀ©ÈÝ¡£

×°ÌîÒò×ÓÉè¼Æ³É0.75µÄÄ¿µÄÊÇΪÁËÆ½ºâʱ¼äºÍ¿Õ¼äÐÔÄÜ¡£¹ýС»áµ¼ÖÂÊý×éÌ«¹ýÓÚÏ¡Ê裬¿Õ¼äÀûÓÃÂʲ»¸ß£»¹ý´ó»áµ¼Ö³åÍ»Ôö´ó£¬Ê±¼ä¸´ÔÓ¶È»áÉÏÉý¡£

¹ØÓÚÆäËü

ºìºÚÊ÷ÊÇÔÚJDK 1.8ÖÐÒýÈëµÄ£¬ÏëÓüòµ¥µÄÓïÑÔÀ´½²Çå³þºìºÚÊ÷µÄÊý¾Ý½á¹¹¡¢Ôöɾ¸Ä²é²Ù×÷¼°Ê±¼ä¸´ÔÓ¶È·ÖÎö£¬ÕâÊÇÒ»¸ö¸´ÔÓÇÒ¼èÄѵÄÈÎÎñ£¬¸üÊʺϵ¥¶ÀÀ´ÃèÊö£¬Òò´ËÁô´ýÒÔºó°É¡£

Îå¡¢×îСÍêÃÀ¹þÏ£º¯Êý(Minimal Perfect Hash Function, MPHF)

JdkÖеÄHashMap½â¾öÁËÈÎÒâÊý¾Ý¼¯µÄʱ¼ä¸´ÔÓ¶ÈÎÊÌ⣬ËùÉè¼ÆµÄ¹þÏ£º¯ÊýÔÚδ֪Êý¾Ý¼¯µÄÇé¿öÏÂÓÐÁ¼ºÃµÄ±íÏÖ¡£

µ«Èç¹ûÓÐÒ»¸öÒÑÖªÊý¾Ý¼¯(ÈçJava¹Ø¼ü×Ö¼¯ºÏ)£¬ÈçºÎÉè¼ÆÒ»¸ö¹þÏ£º¯Êý²ÅÄÜͬʱÂú×ãÒÔÏÂÁ½·½ÃæµÄÒªÇó£º

¢Å ÈÝÆ÷ÈÝÁ¿ÓëÊý¾Ý¼¯ºÏµÄ´óСÍêȫһÖ£»

¢Æ ûÓÐÈκγåÍ»¡£

Ò²¾ÍÊÇ˵£¬µ±¸ø¶¨Ò»¸öÈ·¶¨µÄÊý¾Ý¼¯Ê±£¬Èç¹ûÒ»¸ö¹þÏ£º¯ÊýÄÜÈÃÈÝÆ÷µÄÿһ¸ö½ÚµãÓÐÇÒ½öÓÐÒ»¸öÊý¾ÝÔªËØ£¬ÕâÑùµÄ¹þÏ£º¯Êý±ã³ÆÖ®Îª×îСÍêÃÀ¹þÏ£º¯Êý¡£

×î½üÔÚÑо¿±àÒëÔ­Àí£¬Ìᵽ˵ÈçºÎ½â¾ö¹Ø¼ü×Ö¼¯ºÏµÄO(1)ʱ¼ä¸´ÔӶȵIJéÕÒÎÊÌ⣬Ìáµ½ÁË¿ÉÒÔ²ÉÓÃ×îСÍêÃÀ¹þÏ£º¯Êý¡£¿´µ½Ò»¸öÕâÑùµÄÃû´Ê£¬Ë²¼ä¾Í¾õµÃºÜºÃºÜ¸ß´óÉÏ¡£

   
1644 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ