Posted IT澶х墰浜?/a> Jav

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相关的知识,希望对你有一定的参考价值。

HashMap鐨勫伐浣滃師鐞嗘槸杩戝勾鏉ュ父瑙佺殑Java闈㈣瘯棰樸€傚嚑涔庢瘡涓狫ava绋嬪簭鍛橀兘鐭ラ亾HashMap锛岄兘鐭ラ亾鍝噷瑕佺敤HashMap锛岀煡閬?/span>Hashtable鍜孒ashMap涔嬮棿鐨勫尯鍒?/span>锛岄偅涔堜负浣曡繖閬撻潰璇曢濡傛鐗规畩鍛紵鏄洜涓鸿繖閬撻鑰冨療鐨勬繁搴﹀緢娣便€傝繖棰樼粡甯稿嚭鐜板湪楂樼骇鎴栦腑楂樼骇闈㈣瘯涓€傛姇璧勯摱琛屾洿鍠滄闂繖涓棶棰橈紝鐢氳嚦浼氳姹備綘瀹炵幇HashMap鏉ヨ€冨療浣犵殑缂栫▼鑳藉姏銆侰oncurrentHashMap鍜屽叾瀹冨悓姝ラ泦鍚堢殑寮曞叆璁╄繖閬撻鍙樺緱鏇村姞澶嶆潅銆傝鎴戜滑寮€濮嬫帰绱㈢殑鏃呯▼鍚э紒


鍏堟潵浜涚畝鍗曠殑闂

鈥滀綘鐢ㄨ繃HashMap鍚楋紵鈥?鈥滀粈涔堟槸HashMap锛熶綘涓轰粈涔堢敤鍒板畠锛熲€?/strong>

鍑犱箮姣忎釜浜洪兘浼氬洖绛斺€滄槸鐨勨€濓紝鐒跺悗鍥炵瓟HashMap鐨勪竴浜涚壒鎬э紝璀HashMap鍙互鎺ュ彈null閿€煎拰鍊硷紝鑰孒ashtable鍒欎笉鑳斤紱HashMap鏄潪synchronized;HashMap寰堝揩锛涗互鍙奌ashMap鍌ㄥ瓨鐨勬槸閿€煎绛夌瓑銆傝繖鏄剧ず鍑轰綘宸茬粡鐢ㄨ繃HashMap锛岃€屼笖瀵瑰畠鐩稿綋鐨勭啛鎮夈€備絾鏄潰璇曞畼鏉ヤ釜鎬ヨ浆鐩翠笅锛屼粠姝ゅ埢寮€濮嬮棶鍑轰竴浜涘垇閽荤殑闂锛屽叧浜嶩ashMap鐨勬洿澶氬熀纭€鐨勭粏鑺傘€傞潰璇曞畼鍙兘浼氶棶鍑轰笅闈㈢殑闂锛?/span>

鈥滀綘鐭ラ亾HashMap鐨勫伐浣滃師鐞嗗悧锛熲€?鈥滀綘鐭ラ亾HashMap鐨刧et()鏂规硶鐨勫伐浣滃師鐞嗗悧锛熲€?/strong>

浣犱篃璁镐細鍥炵瓟鈥滄垜娌℃湁璇︽煡鏍囧噯鐨凧ava API锛屼綘鍙互鐪嬬湅Java婧愪唬鐮佹垨鑰匫pen JDK銆傗€濃€滄垜鍙互鐢℅oogle鎵惧埌绛旀銆傗€?/span>

浣嗕竴浜涢潰璇曡€呭彲鑳藉彲浠ョ粰鍑虹瓟妗堬紝鈥淗ashMap鏄熀浜巋ashing鐨勫師鐞嗭紝鎴戜滑浣跨敤put(key, value)瀛樺偍瀵硅薄鍒癏ashMap涓紝浣跨敤get(key)浠嶩ashMap涓幏鍙栧璞°€傚綋鎴戜滑缁檖ut()鏂规硶浼犻€掗敭鍜屽€兼椂锛屾垜浠厛瀵归敭璋冪敤hashCode()鏂规硶锛岃繑鍥炵殑hashCode鐢ㄤ簬鎵惧埌bucket浣嶇疆鏉ュ偍瀛楨ntry瀵硅薄銆傗€濊繖閲屽叧閿偣鍦ㄤ簬鎸囧嚭锛孒ashMap鏄湪bucket涓偍瀛橀敭瀵硅薄鍜屽€煎璞★紝浣滀负Map.Entry銆傝繖涓€鐐规湁鍔╀簬鐞嗚В鑾峰彇瀵硅薄鐨勯€昏緫銆傚鏋滀綘娌℃湁鎰忚瘑鍒拌繖涓€鐐癸紝鎴栬€呴敊璇殑璁や负浠呬粎鍙湪bucket涓瓨鍌ㄥ€肩殑璇濓紝浣犲皢涓嶄細鍥炵瓟濡備綍浠嶩ashMap涓幏鍙栧璞$殑閫昏緫銆傝繖涓瓟妗堢浉褰撶殑姝g‘锛屼篃鏄剧ず鍑洪潰璇曡€呯‘瀹炵煡閬揾ashing浠ュ強HashMap鐨勫伐浣滃師鐞嗐€備絾鏄繖浠呬粎鏄晠浜嬬殑寮€濮嬶紝褰撻潰璇曞畼鍔犲叆涓€浜汮ava绋嬪簭鍛樻瘡澶╄纰板埌鐨勫疄闄呭満鏅殑鏃跺€欙紝閿欒鐨勭瓟妗堥鐜般€備笅涓棶棰樺彲鑳芥槸鍏充簬HashMap涓殑纰版挒鎺㈡祴(collision detection)浠ュ強纰版挒鐨勮В鍐虫柟娉曪細

鈥滃綋涓や釜瀵硅薄鐨刪ashcode鐩稿悓浼氬彂鐢熶粈涔堬紵鈥?/strong> 

浠庤繖閲屽紑濮嬶紝鐪熸鐨勫洶鎯戝紑濮嬩簡锛屼竴浜涢潰璇曡€呬細鍥炵瓟鍥犱负hashcode鐩稿悓锛屾墍浠ヤ袱涓璞℃槸鐩哥瓑鐨勶紝HashMap灏嗕細鎶涘嚭寮傚父锛屾垨鑰呬笉浼氬瓨鍌ㄥ畠浠€傜劧鍚庨潰璇曞畼鍙兘浼氭彁閱掍粬浠湁equals()鍜宧ashCode()涓や釜鏂规硶锛屽苟鍛婅瘔浠栦滑涓や釜瀵硅薄灏辩畻hashcode鐩稿悓锛屼絾鏄畠浠彲鑳藉苟涓嶇浉绛夈€備竴浜涢潰璇曡€呭彲鑳藉氨姝ゆ斁寮冿紝鑰屽彟澶栦竴浜涜繕鑳界户缁尯杩涳紝浠栦滑鍥炵瓟鈥滃洜涓篽ashcode鐩稿悓锛屾墍浠ュ畠浠殑bucket浣嶇疆鐩稿悓锛屸€樼鎾炩€欎細鍙戠敓銆傚洜涓篐ashMap浣跨敤閾捐〃瀛樺偍瀵硅薄锛岃繖涓狤ntry(鍖呭惈鏈夐敭鍊煎鐨凪ap.Entry瀵硅薄)浼氬瓨鍌ㄥ湪閾捐〃涓€傗€濊繖涓瓟妗堥潪甯哥殑鍚堢悊锛岃櫧鐒舵湁寰堝绉嶅鐞嗙鎾炵殑鏂规硶锛岃繖绉嶆柟娉曟槸鏈€绠€鍗曠殑锛屼篃姝f槸HashMap鐨勫鐞嗘柟娉曘€備絾鏁呬簨杩樻病鏈夊畬缁擄紝闈㈣瘯瀹樹細缁х画闂細

鈥滃鏋滀袱涓敭鐨刪ashcode鐩稿悓锛屼綘濡備綍鑾峰彇鍊煎璞★紵鈥?/strong> 

闈㈣瘯鑰呬細鍥炵瓟锛氬綋鎴戜滑璋冪敤get()鏂规硶锛孒ashMap浼氫娇鐢ㄩ敭瀵硅薄鐨刪ashcode鎵惧埌bucket浣嶇疆锛岀劧鍚庤幏鍙栧€煎璞°€傞潰璇曞畼鎻愰啋浠栧鏋滄湁涓や釜鍊煎璞″偍瀛樺湪鍚屼竴涓猙ucket锛屼粬缁欏嚭绛旀:灏嗕細閬嶅巻閾捐〃鐩村埌鎵惧埌鍊煎璞°€傞潰璇曞畼浼氶棶鍥犱负浣犲苟娌℃湁鍊煎璞″幓姣旇緝锛屼綘鏄浣曠‘瀹氱‘瀹氭壘鍒板€煎璞$殑锛熼櫎闈為潰璇曡€呯洿鍒癏ashMap鍦ㄩ摼琛ㄤ腑瀛樺偍鐨勬槸閿€煎锛屽惁鍒欎粬浠笉鍙兘鍥炵瓟鍑鸿繖涓€棰樸€?/span>

鍏朵腑涓€浜涜寰楄繖涓噸瑕佺煡璇嗙偣鐨勯潰璇曡€呬細璇达紝鎵惧埌bucket浣嶇疆涔嬪悗锛屼細璋冪敤keys.equals()鏂规硶鍘绘壘鍒伴摼琛ㄤ腑姝g‘鐨勮妭鐐癸紝鏈€缁堟壘鍒拌鎵剧殑鍊煎璞°€傚畬缇庣殑绛旀锛?/span>

璁稿鎯呭喌涓嬶紝闈㈣瘯鑰呬細鍦ㄨ繖涓幆鑺備腑鍑洪敊锛屽洜涓轰粬浠贩娣嗕簡hashCode()鍜宔quals()鏂规硶銆傚洜涓哄湪姝や箣鍓峢ashCode()灞″薄鍑虹幇锛岃€宔quals()鏂规硶浠呬粎鍦ㄨ幏鍙栧€煎璞$殑鏃跺€欐墠鍑虹幇銆備竴浜涗紭绉€鐨勫紑鍙戣€呬細鎸囧嚭浣跨敤涓嶅彲鍙樼殑銆佸0鏄庝綔final鐨勫璞★紝骞朵笖閲囩敤鍚堥€傜殑equals()鍜宧ashCode()鏂规硶鐨勮瘽锛屽皢浼氬噺灏戠鎾炵殑鍙戠敓锛屾彁楂樻晥鐜囥€備笉鍙彉鎬т娇寰楄兘澶熺紦瀛樹笉鍚岄敭鐨刪ashcode锛岃繖灏嗘彁楂樻暣涓幏鍙栧璞$殑閫熷害锛屼娇鐢⊿tring锛孖nterger杩欐牱鐨剋rapper绫讳綔涓洪敭鏄潪甯稿ソ鐨勯€夋嫨銆?/span>

濡傛灉浣犺涓哄埌杩欓噷宸茬粡瀹岀粨浜嗭紝閭d箞鍚埌涓嬮潰杩欎釜闂鐨勬椂鍊欙紝浣犱細澶у悆涓€鎯娿€?/span>

鈥滃鏋淗ashMap鐨勫ぇ灏忚秴杩囦簡璐熻浇鍥犲瓙(load factor)瀹氫箟鐨勫閲忥紝鎬庝箞鍔烇紵鈥?/strong>

闄ら潪浣犵湡姝g煡閬揌ashMap鐨勫伐浣滃師鐞嗭紝鍚﹀垯浣犲皢鍥炵瓟涓嶅嚭杩欓亾棰樸€傞粯璁ょ殑璐熻浇鍥犲瓙澶у皬涓?.75锛屼篃灏辨槸璇达紝褰撲竴涓猰ap濉弧浜?5%鐨刡ucket鏃跺€欙紝鍜屽叾瀹冮泦鍚堢被(濡侫rrayList绛?涓€鏍凤紝灏嗕細鍒涘缓鍘熸潵HashMap澶у皬鐨勪袱鍊嶇殑bucket鏁扮粍锛屾潵閲嶆柊璋冩暣map鐨勫ぇ灏忥紝骞跺皢鍘熸潵鐨勫璞℃斁鍏ユ柊鐨刡ucket鏁扮粍涓€傝繖涓繃绋嬪彨浣渞ehashing锛屽洜涓哄畠璋冪敤hash鏂规硶鎵惧埌鏂扮殑bucket浣嶇疆銆?/span>

濡傛灉浣犺兘澶熷洖绛旇繖閬撻棶棰橈紝涓嬮潰鐨勯棶棰樻潵浜嗭細

鈥滀綘浜嗚В閲嶆柊璋冩暣HashMap澶у皬瀛樺湪浠€涔堥棶棰樺悧锛熲€?/strong>

浣犲彲鑳藉洖绛斾笉涓婃潵锛岃繖鏃堕潰璇曞畼浼氭彁閱掍綘褰撳绾跨▼鐨勬儏鍐典笅锛屽彲鑳戒骇鐢熸潯浠剁珵浜?race condition)銆?/span>

褰撻噸鏂拌皟鏁碒ashMap澶у皬鐨勬椂鍊欙紝纭疄瀛樺湪鏉′欢绔炰簤锛屽洜涓哄鏋滀袱涓嚎绋嬮兘鍙戠幇HashMap闇€瑕侀噸鏂拌皟鏁村ぇ灏忎簡锛屽畠浠細鍚屾椂璇曠潃璋冩暣澶у皬銆傚湪璋冩暣澶у皬鐨勮繃绋嬩腑锛屽瓨鍌ㄥ湪閾捐〃涓殑鍏冪礌鐨勬搴忎細鍙嶈繃鏉ワ紝鍥犱负绉诲姩鍒版柊鐨刡ucket浣嶇疆鐨勬椂鍊欙紝HashMap骞朵笉浼氬皢鍏冪礌鏀惧湪閾捐〃鐨勫熬閮紝鑰屾槸鏀惧湪澶撮儴锛岃繖鏄负浜嗛伩鍏嶅熬閮ㄩ亶鍘?tail traversing)銆傚鏋滄潯浠剁珵浜夊彂鐢熶簡锛岄偅涔堝氨姝诲惊鐜簡銆傝繖涓椂鍊欙紝浣犲彲浠ヨ川闂潰璇曞畼锛屼负浠€涔堣繖涔堝鎬紝瑕佸湪澶氱嚎绋嬬殑鐜涓嬩娇鐢℉ashMap鍛紵锛氾級

鐑績鐨勮鑰呰础鐚簡鏇村鐨勫叧浜嶩ashMap鐨勯棶棰橈細

  1. 涓轰粈涔圫tring, Interger杩欐牱鐨剋rapper绫婚€傚悎浣滀负閿紵 String, Interger杩欐牱鐨剋rapper绫讳綔涓篐ashMap鐨勯敭鏄啀閫傚悎涓嶈繃浜嗭紝鑰屼笖String鏈€涓哄父鐢ㄣ€傚洜涓篠tring鏄笉鍙彉鐨勶紝涔熸槸final鐨勶紝鑰屼笖宸茬粡閲嶅啓浜唀quals()鍜宧ashCode()鏂规硶浜嗐€傚叾浠栫殑wrapper绫讳篃鏈夎繖涓壒鐐广€備笉鍙彉鎬ф槸蹇呰鐨勶紝鍥犱负涓轰簡瑕佽绠梙ashCode()锛屽氨瑕侀槻姝㈤敭鍊兼敼鍙橈紝濡傛灉閿€煎湪鏀惧叆鏃跺拰鑾峰彇鏃惰繑鍥炰笉鍚岀殑hashcode鐨勮瘽锛岄偅涔堝氨涓嶈兘浠嶩ashMap涓壘鍒颁綘鎯宠鐨勫璞°€備笉鍙彉鎬ц繕鏈夊叾浠栫殑浼樼偣濡傜嚎绋嬪畨鍏ㄣ€傚鏋滀綘鍙互浠呬粎閫氳繃灏嗘煇涓猣ield澹版槑鎴恌inal灏辫兘淇濊瘉hashCode鏄笉鍙樼殑锛岄偅涔堣杩欎箞鍋氬惂銆傚洜涓鸿幏鍙栧璞$殑鏃跺€欒鐢ㄥ埌equals()鍜宧ashCode()鏂规硶锛岄偅涔堥敭瀵硅薄姝g‘鐨勯噸鍐欒繖涓や釜鏂规硶鏄潪甯搁噸瑕佺殑銆傚鏋滀袱涓笉鐩哥瓑鐨勫璞¤繑鍥炰笉鍚岀殑hashcode鐨勮瘽锛岄偅涔堢鎾炵殑鍑犵巼灏变細灏忎簺锛岃繖鏍峰氨鑳芥彁楂楬ashMap鐨勬€ц兘銆?/span>

  2. 鎴戜滑鍙互浣跨敤鑷畾涔夌殑瀵硅薄浣滀负閿悧锛?/strong> 杩欐槸鍓嶄竴涓棶棰樼殑寤朵几銆傚綋鐒朵綘鍙兘浣跨敤浠讳綍瀵硅薄浣滀负閿紝鍙瀹冮伒瀹堜簡equals()鍜宧ashCode()鏂规硶鐨勫畾涔夎鍒欙紝骞朵笖褰撳璞℃彃鍏ュ埌Map涓箣鍚庡皢涓嶄細鍐嶆敼鍙樹簡銆傚鏋滆繖涓嚜瀹氫箟瀵硅薄鏃朵笉鍙彉鐨勶紝閭d箞瀹冨凡缁忔弧瓒充簡浣滀负閿殑鏉′欢锛屽洜涓哄綋瀹冨垱寤轰箣鍚庡氨宸茬粡涓嶈兘鏀瑰彉浜嗐€?/span>

  3. 鎴戜滑鍙互浣跨敤CocurrentHashMap鏉ヤ唬鏇縃ashtable鍚楋紵杩欐槸鍙﹀涓€涓緢鐑棬鐨勯潰璇曢锛屽洜涓篊oncurrentHashMap瓒婃潵瓒婂浜虹敤浜嗐€傛垜浠煡閬揌ashtable鏄痵ynchronized鐨勶紝浣嗘槸ConcurrentHashMap鍚屾鎬ц兘鏇村ソ锛屽洜涓哄畠浠呬粎鏍规嵁鍚屾绾у埆瀵筸ap鐨勪竴閮ㄥ垎杩涜涓婇攣銆侰oncurrentHashMap褰撶劧鍙互浠f浛HashTable锛屼絾鏄疕ashTable鎻愪緵鏇村己鐨勭嚎绋嬪畨鍏ㄦ€с€?/span>

鎴戜釜浜哄緢鍠滄杩欎釜闂锛屽洜涓鸿繖涓棶棰樼殑娣卞害鍜屽箍搴︼紝涔熶笉鐩存帴鐨勬秹鍙婂埌涓嶅悓鐨勬蹇点€傝鎴戜滑鍐嶆潵鐪嬬湅杩欎簺闂璁捐鍝簺鐭ヨ瘑鐐癸細

  • hashing鐨勬蹇?/span>

  • HashMap涓В鍐崇鎾炵殑鏂规硶

  • equals()鍜宧ashCode()鐨勫簲鐢紝浠ュ強瀹冧滑鍦℉ashMap涓殑閲嶈鎬?/span>

  • 涓嶅彲鍙樺璞$殑濂藉

  • HashMap澶氱嚎绋嬬殑鏉′欢绔炰簤

  • 閲嶆柊璋冩暣HashMap鐨勫ぇ灏?/span>


鎬荤粨



HashMap鐨勫伐浣滃師鐞?/span>

HashMap鍩轰簬hashing鍘熺悊锛屾垜浠€氳繃put()鍜実et()鏂规硶鍌ㄥ瓨鍜岃幏鍙栧璞°€傚綋鎴戜滑灏嗛敭鍊煎浼犻€掔粰put()鏂规硶鏃讹紝瀹冭皟鐢ㄩ敭瀵硅薄鐨刪ashCode()鏂规硶鏉ヨ绠梙ashcode锛岃鍚庢壘鍒癰ucket浣嶇疆鏉ュ偍瀛樺€煎璞°€傚綋鑾峰彇瀵硅薄鏃讹紝閫氳繃閿璞$殑equals()鏂规硶鎵惧埌姝g‘鐨勯敭鍊煎锛岀劧鍚庤繑鍥炲€煎璞°€侶ashMap浣跨敤閾捐〃鏉ヨВ鍐崇鎾為棶棰橈紝褰撳彂鐢熺鎾炰簡锛屽璞″皢浼氬偍瀛樺湪閾捐〃鐨勪笅涓€涓妭鐐逛腑銆?HashMap鍦ㄦ瘡涓摼琛ㄨ妭鐐逛腑鍌ㄥ瓨閿€煎瀵硅薄銆?/span>

褰撲袱涓笉鍚岀殑閿璞$殑hashcode鐩稿悓鏃朵細鍙戠敓浠€涔堬紵 瀹冧滑浼氬偍瀛樺湪鍚屼竴涓猙ucket浣嶇疆鐨勯摼琛ㄤ腑銆傞敭瀵硅薄鐨別quals()鏂规硶鐢ㄦ潵鎵惧埌閿€煎銆?/span>

鍥犱负HashMap鐨勫ソ澶勯潪甯稿锛屾垜鏇剧粡鍦ㄧ數瀛愬晢鍔$殑搴旂敤涓娇鐢℉ashMap浣滀负缂撳瓨銆傚洜涓洪噾铻嶉鍩熼潪甯稿鐨勮繍鐢↗ava锛屼篃鍑轰簬鎬ц兘鐨勮€冭檻锛屾垜浠細缁忓父鐢ㄥ埌HashMap鍜孋oncurrentHashMap銆?/span>



以上是关于的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别