锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成图片小说网站,亚洲婷婷天堂在线综合,精品国产日韩亚洲一区http://www.tkk7.com/ArcticOcean/category/34757.htmlJust do it錛?/description>zh-cnWed, 11 Aug 2010 11:02:34 GMTWed, 11 Aug 2010 11:02:34 GMT60HashMap鍘熺悊銆佹簮鐮併佸疄璺?/title><link>http://www.tkk7.com/ArcticOcean/archive/2010/08/09/328316.html</link><dc:creator>Cool Jazz</dc:creator><author>Cool Jazz</author><pubDate>Mon, 09 Aug 2010 07:14:00 GMT</pubDate><guid>http://www.tkk7.com/ArcticOcean/archive/2010/08/09/328316.html</guid><wfw:comment>http://www.tkk7.com/ArcticOcean/comments/328316.html</wfw:comment><comments>http://www.tkk7.com/ArcticOcean/archive/2010/08/09/328316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ArcticOcean/comments/commentRss/328316.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ArcticOcean/services/trackbacks/328316.html</trackback:ping><description><![CDATA[HashMap鏄竴縐嶅崄鍒嗗父鐢ㄧ殑鏁版嵁緇撴瀯錛屼綔涓轟竴涓簲鐢ㄥ紑鍙戜漢鍛橈紝瀵瑰叾鍘熺悊銆佸疄鐜扮殑鍔犳繁鐞嗚В鏈夊姪浜庢洿楂樻晥鍦拌繘琛屾暟鎹瓨鍙栥傛湰鏂囨墍鐢ㄧ殑jdk鐗堟湰涓?.5銆?<br /> <br /> <span style="font-size: large"><strong>浣跨敤HashMap</strong></span> <br /> <br /> 銆奅ffective JAVA銆嬩腑璁や負錛?9%鐨勬儏鍐典笅錛屽綋浣犺鐩栦簡equals鏂規硶鍚庯紝璇峰姟蹇呰鐩杊ashCode鏂規硶銆傞粯璁ゆ儏鍐典笅錛岃繖涓よ呬細閲囩敤Object鐨?#8220;鍘熺敓”瀹炵幇鏂瑰紡錛屽嵆錛?<br /> <br /> <div id="nyqwasc" class="dp-highlighter"> <div id="seectfu" class="tools">Java浠g爜錛?a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> <ol class="dp-j"> <li><span><span id="cviicad" class="keyword">protected</span><span> </span><span id="jfajihz" class="keyword">native</span><span> </span><span id="ueojiaz" class="keyword">int</span><span> hashCode();   </span></span> <li><span id="cjeojbp" class="keyword">public</span><span> </span><span id="konuxlk" class="keyword">boolean</span><span> equals(Object obj) {   </span></span> <li><span>    </span><span id="qilsybp" class="keyword">return</span><span> (</span><span id="kcciwkc" class="keyword">this</span><span> == obj);   </span></span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">protected native int hashCode(); public boolean equals(Object obj) { return (this == obj); } </pre> <br /> <br /> hashCode鏂規硶鐨勫畾涔夌敤鍒頒簡native鍏抽敭瀛楋紝琛ㄧず瀹冩槸鐢盋鎴朇++閲囩敤杈冧負搴曞眰鐨勬柟寮忔潵瀹炵幇鐨勶紝浣犲彲浠ヨ涓哄畠榪斿洖浜嗚瀵硅薄鐨勫唴瀛樺湴鍧錛涜岀己鐪乪quals鍒欒涓猴紝鍙湁褰撲袱鑰呭紩鐢ㄥ悓涓涓璞℃椂錛屾墠璁や負瀹冧滑鏄浉絳夌殑銆傚鏋滀綘鍙槸瑕嗙洊浜唀quals()鑰屾病鏈夐噸鏂板畾涔塰ashCode()錛屽湪璇誨彇HashMap鐨勬椂鍊欙紝闄ら潪浣犱嬌鐢ㄤ竴涓笌浣犱繚瀛樻椂寮曠敤瀹屽叏鐩稿悓鐨勫璞′綔涓簁ey鍊鹼紝鍚﹀垯浣犲皢寰椾笉鍒拌key鎵瀵瑰簲鐨勫箋?<br /> <br /> 鍙︿竴鏂歸潰錛屼綘搴旇灝介噺閬垮厤浣跨敤“鍙彉”鐨勭被浣滀負HashMap鐨勯敭銆傚鏋滀綘灝嗕竴涓璞′綔涓洪敭鍊煎茍淇濆瓨鍦℉ashMap涓紝涔嬪悗鍙堟敼鍙樹簡鍏剁姸鎬侊紝閭d箞HashMap灝變細浜х敓娣蜂貢錛屼綘鎵淇濆瓨鐨勫煎彲鑳戒涪澶憋紙灝界閬嶅巻闆嗗悎鍙兘鍙互鎵懼埌錛夈傚彲鍙傝?em><a target="_blank">http://www.ibm.com/developerworks/cn/java/j-jtp02183/</a></em> <br /> <br /> <span style="font-size: large"><strong>HashMap瀛樺彇鏈哄埗</strong></span> <br /> <br /> Hashmap瀹為檯涓婃槸涓涓暟緇勫拰閾捐〃鐨勭粨鍚堜綋錛屽埄鐢ㄦ暟緇勬潵妯℃嫙涓涓釜妗訛紙綾諱技浜嶣ucket Sort錛変互蹇熷瓨鍙栦笉鍚宧ashCode鐨刱ey錛屽浜庣浉鍚宧ashCode鐨勪笉鍚宬ey錛屽啀璋冪敤鍏秂quals鏂規硶浠嶭ist涓彁鍙栧嚭鍜宬ey鎵鐩稿搴旂殑value銆?<br /> <br /> JAVA涓環ashMap鐨勫垵濮嬪寲涓昏鏄負initialCapacity鍜宭oadFactor榪欎袱涓睘鎬ц祴鍊箋傚墠鑰呰〃紺篽ashMap涓敤鏉ュ尯鍒嗕笉鍚宧ash鍊肩殑key絀洪棿闀垮害錛屽悗鑰呮槸鎸囧畾浜嗗綋hashMap涓殑鍏冪礌瓚呰繃澶氬皯鐨勬椂鍊欙紝寮濮嬭嚜鍔ㄦ墿瀹癸紝銆傞粯璁ゆ儏鍐典笅initialCapacity涓?6錛宭oadFactor涓?.75錛屽畠琛ㄧず涓寮濮媓ashMap鍙互瀛樻斁16涓笉鍚岀殑hashCode錛屽綋濉厖鍒扮12涓殑鏃跺欙紝hashMap浼氳嚜鍔ㄥ皢鍏秌ey絀洪棿鐨勯暱搴︽墿瀹瑰埌32錛屼互姝ょ被鎺紱榪欑偣鍙互浠庢簮鐮佷腑鐪嬪嚭鏉ワ細 <br /> <br /> <div id="bqazjxw" class="dp-highlighter"> <div id="ynkyxps" class="bar">Java浠g爜錛?/div> <ol class="dp-j"> <li><span><span id="iakjeeu" class="keyword">void</span><span> addEntry(</span><span id="ssgqajq" class="keyword">int</span><span> hash, K key, V value, </span><span id="hsrxwov" class="keyword">int</span><span> bucketIndex) {   </span></span> <li><span>    Entry<K,V> e = table[bucketIndex];   </span> <li><span>        table[bucketIndex] = </span><span id="ujpkyme" class="keyword">new</span><span> Entry<K,V>(hash, key, value, e);   </span></span> <li><span>        </span><span id="iisgedg" class="keyword">if</span><span> (size++ >= threshold)   </span></span> <li><span>            resize(</span><span id="ynisgux" class="number">2</span><span> * table.length);   </span></span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } </pre> <br /> <br /> 鑰屾瘡褰揾ashMap鎵╁鍚庯紝鍐呴儴鐨勬瘡涓厓绱犲瓨鏀劇殑浣嶇疆閮戒細鍙戠敓鍙樺寲錛堝洜涓哄厓绱犵殑鏈緇堜綅緗槸鍏秇ashCode瀵筴ey絀洪棿闀垮害鍙栨ā鑰屽緱錛夛紝鍥犳resize鏂規硶涓張浼氳皟鐢╰ransfer鍑芥暟錛岀敤鏉ラ噸鏂板垎閰嶅唴閮ㄧ殑鍏冪礌錛涜繖涓繃紼嬫垚涓簉ehash錛屾槸鍗佸垎娑堣楁ц兘鐨勶紝鍥犳鍦ㄥ彲棰勭煡鍏冪礌鐨勪釜鏁扮殑鎯呭喌涓嬶紝涓鑸簲璇ラ伩鍏嶄嬌鐢ㄧ己鐪佺殑initialCapacity錛岃屾槸閫氳繃鏋勯犲嚱鏁頒負鍏舵寚瀹氫竴涓箋備緥濡傛垜浠彲鑳戒細鎯寵灝嗘暟鎹簱鏌ヨ鎵寰?000鏉¤褰曚互鏌愪釜鐗瑰畾瀛楁錛堟瘮濡侷D錛変負key緙撳瓨鍦╤ashMap涓紝涓轟簡鎻愰珮鏁堢巼銆侀伩鍏峳ehash錛屽彲浠ョ洿鎺ユ寚瀹歩nitialCapacity涓?048銆?<br /> <br /> 鍙︿竴涓煎緱娉ㄦ剰鐨勫湴鏂規槸錛宧ashMap鍏秌ey絀洪棿鐨勯暱搴︿竴瀹氫負2鐨凬嬈℃柟錛岃繖涓鐐瑰彲浠ヤ粠涓涓嬫簮鐮佷腑鐪嬪嚭鏉ワ細 <br /> <div id="ggmsnqe" class="dp-highlighter"> <div id="epvbskn" class="tools">Java浠g爜錛?/div> <ol class="dp-j"> <li><span><span id="ielgvlo" class="keyword">int</span><span> capacity = </span><span id="ttojiak" class="number">1</span><span>;   </span></span> <li><span id="sscfewc" class="keyword">while</span><span> (capacity < initialCapacity)    </span></span> <li><span>    capacity <<= </span><span id="warxdgc" class="number">1</span><span>;  </span></span> </li> </ol> </div> <pre class="java" style="display: none" name="code">int capacity = 1; while (capacity < initialCapacity) capacity <<= 1; </pre> <br /> <br /> 鍗充嬌鎴戜滑鍦ㄦ瀯閫犲嚱鏁頒腑鎸囧畾鐨刬nitialCapacity涓嶆槸2鐨勫鉤鏂規暟錛宑apacity榪樻槸浼氳璧嬪間負2鐨凬嬈℃柟銆?<br /> <br /> 涓轟粈涔圫un Microsystem鐨勫伐紼嬪笀瑕佸皢hashMap key絀洪棿鐨勯暱搴﹁涓?鐨凬嬈℃柟鍛紵榪欓噷鍙傝僐.W.Floyed緇欏嚭鐨勮 閲忔暎鍒楁濇兂鐨勪笁涓爣鍑嗭細 <br /> <br /> <ul><br /> 涓涓ソ鐨刪ash綆楁硶鐨勮綆楀簲璇ユ槸闈炲父蹇殑 <br /> 涓涓ソ鐨刪ash綆楁硶搴旇鏄啿紿佹瀬灝忓寲 <br /> 濡傛灉瀛樺湪鍐茬獊,搴旇鏄啿紿佸潎鍖鍖?<br /> </ul> <br /> <br /> 涓轟簡灝嗗悇鍏冪礌鐨刪ashCode淇濆瓨鑷抽暱搴︿負Length鐨刱ey鏁扮粍涓紝涓鑸噰鐢ㄥ彇妯$殑鏂瑰紡錛屽嵆index = hashCode % Length銆備笉鍙伩鍏嶇殑錛屽瓨鍦ㄥ涓笉鍚屽璞$殑hashCode琚畨鎺掑湪鍚屼竴浣嶇疆錛岃繖灝辨槸鎴戜滑騫蟲椂鎵璋撶殑“鍐茬獊”銆傚鏋滀粎浠呮槸鑰冭檻鍏冪礌鍧囧寑鍖栦笌鍐茬獊鏋佸皬鍖栵紝浼間箮搴旇灝哃ength鍙栦負绱犳暟錛堝敖綆℃病鏈夋槑鏄劇殑鐞嗚鏉ユ敮鎸佽繖涓鐐癸紝浣嗘暟瀛﹀浠氳繃澶ч噺鐨勫疄璺靛緱鍑虹粨璁猴紝瀵圭礌鏁板彇妯$殑浜х敓緇撴灉鐨勬棤鍏蟲ц澶т簬鍏跺畠鏁板瓧錛夈備負姝わ紝Craig Larman and Rhett Guthrie銆奐ava Performence銆嬩腑瀵規涔熷ぇ鍔犳姩鍑匯備負浜嗗紕娓呮榪欎釜闂錛孊ruce Eckel錛圱hinking in JAVA鐨勪綔鑰咃級涓撶▼閲囪浜唈ava.util.hashMap鐨勪綔鑰匤oshua Bloch錛屽茍灝嗕粬閲囩敤榪欑璁捐鐨勫師鍥犳斁鍒頒簡緗戜笂錛?a target=_blank><em>http://www.roseindia.net/javatutorials/javahashmap.shtml</em></a>錛?銆?<br /> <br /> 涓婅堪璁捐鐨勫師鍥犲湪浜庯紝鍙栨ā榪愮畻鍦ㄥ寘鎷琂AVA鍦ㄥ唴鐨勫ぇ澶氭暟璇█涓殑鏁堢巼閮藉崄鍒嗕綆涓嬶紝鑰屽綋闄ゆ暟涓?鐨凬嬈℃柟鏃訛紝鍙栨ā榪愮畻灝嗛鍖栦負鏈綆鍗曠殑浣嶈繍綆楋紝鍏舵晥鐜囨槑鏄炬彁鍗囷紙鎸夌収Bruce Eckel緇欏嚭鐨勬暟鎹紝澶х害鍙互鎻愬崌5锝?鍊嶏級 銆傜湅鐪婮DK涓槸濡備綍瀹炵幇鐨勶細 <br /> <br /> <div id="osueogj" class="dp-highlighter"> <div id="ujwrmel" class="tools">Java浠g爜錛?/div> <ol class="dp-j"> <li><span><span id="iaknxth" class="keyword">static</span><span> </span><span id="skybasg" class="keyword">int</span><span> indexFor(</span><span id="kvflgub" class="keyword">int</span><span> h, </span><span id="ohrupsg" class="keyword">int</span><span> length) {   </span></span> <li><span>    </span><span id="tisvume" class="keyword">return</span><span> h & (length-</span><span id="qqlznqt" class="number">1</span><span>);   </span></span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">static int indexFor(int h, int length) { return h & (length-1); } </pre> <br /> <br /> 褰搆ey絀洪棿闀垮害涓?鐨凬嬈℃柟鏃訛紝璁$畻hashCode涓篽鐨勫厓绱犵殑绱㈠紩鍙互鐢ㄧ畝鍗曠殑涓庢搷浣滄潵浠f浛絎ㄦ嫏鐨勫彇妯℃搷浣滐紒鍋囪鏌愪釜瀵硅薄鐨刪ashCode涓?5錛堜簩榪涘埗涓?00011錛夛紝鑰宧ashMap閲囩敤榛樿鐨刬nitialCapacity錛?6錛夛紝閭d箞indexFor璁$畻鎵寰楃粨鏋滃皢浼氭槸100011 & 1111 = 11錛屽嵆鍗佽繘鍒剁殑3錛屾槸涓嶆槸鎭板ソ鏄?5 Mod 16銆?<br /> <br /> 涓婇潰鐨勬柟娉曟湁涓涓棶棰橈紝灝辨槸瀹冪殑璁$畻緇撴灉浠呮湁瀵硅薄hashCode鐨勪綆浣嶅喅瀹氾紝鑰岄珮浣嶈緇熺粺灞忚斀浜嗭紱浠ヤ笂闈負渚嬶紝19錛?0011錛夈?5錛?00011錛夈?7錛?000011錛夌瓑灝卞叿鏈夌浉鍚岀殑緇撴灉銆傞拡瀵硅繖涓棶棰橈紝 Joshua Bloch閲囩敤浜?#8220;闃插盡鎬х紪紼?#8221;鐨勮В鍐蟲柟娉曪紝鍦ㄤ嬌鐢ㄥ悇瀵硅薄鐨刪ashCode涔嬪墠瀵瑰叾榪涜浜屾Hash錛屽弬鐪婮DK涓殑婧愮爜錛?<br /> <br /> <div id="dznbwoc" class="dp-highlighter"> <div id="yftoyqi" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="ahnilzn" class="keyword">static</span><span> </span><span id="zofihzr" class="keyword">int</span><span> hash(Object x) {   </span></span> <li><span>        </span><span id="qmhcqtl" class="keyword">int</span><span> h = x.hashCode();   </span></span> <li><span>        h += ~(h << </span><span id="mayiwkj" class="number">9</span><span>);   </span></span> <li><span>        h ^=  (h >>> </span><span id="qupsnfm" class="number">14</span><span>);   </span></span> <li><span>        h +=  (h << </span><span id="exhcbes" class="number">4</span><span>);   </span></span> <li><span>        h ^=  (h >>> </span><span id="epdrqeh" class="number">10</span><span>);   </span></span> <li><span>        </span><span id="gdjmwoc" class="keyword">return</span><span> h;   </span></span> <li><span>    }  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">static int hash(Object x) { int h = x.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } </pre> <br /> <br /> 閲囩敤榪欑鏃嬭漿Hash鍑芥暟鐨勪富瑕佺洰鐨勬槸璁╁師鏈塰ashCode鐨勯珮浣嶄俊鎭篃鑳借鍏呭垎鍒╃敤錛屼笖鍏奸【璁$畻鏁堢巼浠ュ強鏁版嵁緇熻鐨勭壒鎬э紝鍏跺叿浣撶殑鍘熺悊宸茶秴鍑轟簡鏈枃鐨勯鍩熴?<br /> <br /> 鍔犲揩Hash鏁堢巼鐨勫彟涓涓湁鏁堥斿緞鏄紪鍐欒壇濂界殑鑷畾涔夊璞$殑HashCode錛孲tring鐨勫疄鐜伴噰鐢ㄤ簡濡備笅鐨勮綆楁柟娉曪細 <br /> <br /> <div id="slvqeao" class="dp-highlighter"> <div id="fuescub" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="uocxhvz" class="keyword">for</span><span> (</span><span id="oekuisq" class="keyword">int</span><span> i = </span><span id="ykdgfml" class="number">0</span><span>; i < len; i++) {   </span></span> <li><span>h = </span><span id="jznxsrq" class="number">31</span><span>*h + val[off++];   </span></span> <li><span>}   </span> <li><span>hash = h;  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; </pre> <br /> <br /> 榪欑鏂規硶HashCode鐨勮綆楁柟娉曞彲鑳芥渶鏃╁嚭鐜板湪Brian W. Kernighan鍜孌ennis M. Ritchie鐨勩奣he C Programming Language銆嬩腑錛岃璁や負鏄т環姣旀渶楂樼殑綆楁硶錛堝張琚О涓簍imes33綆楁硶錛屽洜涓篊涓箻鏁板父閲忎負33錛孞AVA涓敼涓?1錛夛紝瀹為檯涓婏紝鍖呮嫭List鍦ㄥ唴鐨勫ぇ澶氭暟鐨勫璞¢兘鏄敤榪欑鏂規硶璁$畻Hash鍊箋?<br /> <br /> 鍙︿竴縐嶆瘮杈冪壒孌婄殑hash綆楁硶縐頒負甯冮殕榪囨護鍣紝瀹冧互鐗虹壊緇嗗井綺懼害涓轟唬浠鳳紝鎹㈡潵瀛樺偍絀洪棿鐨勫ぇ閲忚妭淇紝甯哥敤浜庤濡傚垽鏂敤鎴峰悕閲嶅銆佹槸鍚﹀湪榛戝悕鍗曚笂絳夌瓑錛屽彲浠ュ弬鑰冩潕寮澶嶇殑鏁板涔嬬編緋誨垪絎?3綃囷紙<em><a target="_blank">http://googlechinablog.com/2006/08/blog-post.html</a></em>錛?<br /> <br /> <span style="font-size: large"><strong>Fail-Fast鏈哄埗</strong></span> <br /> <br /> 浼楁墍鍛ㄧ煡錛孒ashMap涓嶆槸綰跨▼瀹夊叏鐨勯泦鍚堢被銆備絾鍦ㄦ煇浜涘閿欒兘鍔涜緝濂界殑搴旂敤涓紝濡傛灉浣犱笉鎯充粎浠呭洜涓?%鐨勫彲鑳芥ц屽幓鎵垮彈hashTable鐨勫悓姝ュ紑閿錛屽垯鍙互鑰冭檻鍒╃敤涓涓婬ashMap鐨凢ail-Fast鏈哄埗錛屽叾鍏蜂綋瀹炵幇濡備笅錛?<br /> <br /> <div id="xrxscui" class="dp-highlighter"> <div id="yorqwog" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span>Entry<K,V> nextEntry() {    </span></span> <li><span id="glznqbw" class="keyword">if</span><span> (modCount != expectedModCount)   </span></span> <li><span>    </span><span id="omwcmad" class="keyword">throw</span><span> </span><span id="fkjisoj" class="keyword">new</span><span> ConcurrentModificationException();   </span></span> <li><span>                     ……   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">Entry<K,V> nextEntry() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); …… } </pre> <br /> <br /> 鍏朵腑modCount涓篐ashMap鐨勪竴涓疄渚嬪彉閲忥紝騫朵笖琚0鏄庝負volatile錛岃〃紺轟換浣曠嚎紼嬮兘鍙互鐪嬪埌璇ュ彉閲忚鍏跺畠綰跨▼淇敼鐨勭粨鏋滐紙鏍規嵁JVM鍐呭瓨妯″瀷鐨勪紭鍖栵紝姣忎竴涓嚎紼嬮兘浼氬瓨涓浠借嚜宸辯殑宸ヤ綔鍐呭瓨錛屾宸ヤ綔鍐呭瓨鐨勫唴瀹逛笌鏈湴鍐呭瓨騫墮潪鏃舵椂鍒誨埢閮藉悓姝ワ紝鍥犳鍙兘浼氬嚭鐜扮嚎紼嬮棿鐨勪慨鏀逛笉鍙鐨勯棶棰橈級 銆備嬌鐢↖terator寮濮嬭凱浠f椂錛屼細灝唌odCount鐨勮祴鍊肩粰expectedModCount錛屽湪榪唬榪囩▼涓紝閫氳繃姣忔姣旇緝涓よ呮槸鍚︾浉絳夋潵鍒ゆ柇HashMap鏄惁鍦ㄥ唴閮ㄦ垨琚叾瀹冪嚎紼嬩慨鏀廣侶ashMap鐨勫ぇ澶氭暟淇敼鏂規硶閮戒細鏀瑰彉ModCount錛屽弬鑰冧笅闈㈢殑婧愮爜錛?<br /> <div id="pnmsgji" class="dp-highlighter"> <div id="zidcfea" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="anbaorm" class="keyword">public</span><span> V put(K key, V value) {   </span></span> <li><span>    K k = maskNull(key);   </span> <li><span>        </span><span id="hjpsnqi" class="keyword">int</span><span> hash = hash(k);   </span></span> <li><span>        </span><span id="eruedzg" class="keyword">int</span><span> i = indexFor(hash, table.length);   </span></span> <li><span>        </span><span id="kbvftwd" class="keyword">for</span><span> (Entry<K,V> e = table[i]; e != </span><span id="tcbaonq" class="keyword">null</span><span>; e = e.next) {   </span></span> <li><span>            </span><span id="wjmscuq" class="keyword">if</span><span> (e.hash == hash && eq(k, e.key)) {   </span></span> <li><span>                V oldValue = e.value;   </span> <li><span>                e.value = value;   </span> <li><span>                e.recordAccess(</span><span id="izgbtsk" class="keyword">this</span><span>);   </span></span> <li><span>                </span><span id="xzcqtld" class="keyword">return</span><span> oldValue;   </span></span> <li><span>            }   </span> <li><span>        }   </span> <li><span>        modCount++;   </span> <li><span>        addEntry(hash, k, value, i);   </span> <li><span>        </span><span id="pgqwgui" class="keyword">return</span><span> </span><span id="fdctokc" class="keyword">null</span><span>;   </span></span> <li><span>    }  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">public V put(K key, V value) { K k = maskNull(key); int hash = hash(k); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { if (e.hash == hash && eq(k, e.key)) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, k, value, i); return null; }</pre> <br /> <br /> 浠ut鏂規硶涓轟緥錛屾瘡嬈″線HashMap涓坊鍔犲厓绱犻兘浼氬鑷磎odCount鑷銆傚叾瀹冭濡俽emove銆乧lear鏂規硶涔熼兘鍖呭惈綾諱技鐨勬搷浣溿?<br /> 浠庝笂闈㈠彲浠ョ湅鍑猴紝HashMap鎵閲囩敤鐨凢ail-Fast鏈哄埗鏈川涓婃槸涓縐嶄箰瑙傞攣鏈哄埗錛岄氳繃媯鏌ョ姸鎬佲斺旀病鏈夐棶棰樺垯蹇界暐鈥斺旀湁闂鍒欐姏鍑哄紓甯哥殑鏂瑰紡錛屾潵閬垮厤綰跨▼鍚屾鐨勫紑閿錛屼笅闈㈢粰鍑轟竴涓湪鍗曠嚎紼嬬幆澧冧笅鍙戠敓Fast-Fail鐨勪緥瀛愶細 <br /> <br /> <div id="bdyihkc" class="dp-highlighter"> <div id="ctwdcjt" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="wyesyqm" class="keyword">class</span><span> Test {     </span></span> <li><span>    </span><span id="gxdjeov" class="keyword">public</span><span> </span><span id="bzjthgy" class="keyword">static</span><span> </span><span id="clvfehk" class="keyword">void</span><span> main(String[] args) {                </span></span> <li><span>        java.util.HashMap<Object,String> map=</span><span id="dbwkuqi" class="keyword">new</span><span> java.util.HashMap<Object,String>();     </span></span> <li><span>       map.put(</span><span id="uhrqaog" class="keyword">new</span><span> Object(), </span><span id="vxwvfxh" class="string">"a"</span><span>);     </span></span> <li><span>       map.put(</span><span id="wyidnfx" class="keyword">new</span><span> Object(), </span><span id="anbavry" class="string">"b"</span><span>);     </span></span> <li><span>       java.util.Iterator<Object> it=map.keySet().iterator();     </span> <li><span>       </span><span id="qwfpzrj" class="keyword">while</span><span>(it.hasNext()){     </span></span> <li><span>           it.next();     </span> <li><span>           map.put(</span><span id="obwzcyu" class="string">""</span><span>, </span><span id="tgutdou" class="string">""</span><span>);          </span></span> <li><span>        System.out.println(map.size());     </span> <li><span>    }     </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">class Test { public static void main(String[] args) { java.util.HashMap<Object,String> map=new java.util.HashMap<Object,String>(); map.put(new Object(), "a"); map.put(new Object(), "b"); java.util.Iterator<Object> it=map.keySet().iterator(); while(it.hasNext()){ it.next(); map.put("", ""); System.out.println(map.size()); } }</pre> <br /> <br /> 榪愯涓婇潰鐨勪唬鐮佷細鎶涘嚭java.util.ConcurrentModificationException錛屽洜涓哄湪榪唬榪囩▼涓慨鏀逛簡HashMap鍐呴儴鐨勫厓绱犲鑷磎odCount鑷銆傝嫢灝嗕笂闈唬鐮佷腑 map.put(new Object(), "b") 榪欏彞娉ㄩ噴鎺夛紝紼嬪簭浼氶『鍒╅氳繃錛屽洜涓烘鏃禜ashMap涓彧鍖呭惈涓涓厓绱狅紝緇忚繃涓嬈¤凱浠e悗宸插埌浜嗗熬閮紝鎵浠ヤ笉浼氬嚭鐜伴棶棰橈紝涔熷氨娌℃湁鎶涘嚭寮傚父鐨勫繀瑕佷簡銆?<br /> 鍦ㄩ氬父騫跺彂鐜涓嬶紝榪樻槸寤鴻閲囩敤鍚屾鏈哄埗銆傝繖涓鑸氳繃瀵硅嚜鐒跺皝瑁呰鏄犲皠鐨勫璞¤繘琛屽悓姝ユ搷浣滄潵瀹屾垚銆傚鏋滀笉瀛樺湪榪欐牱鐨勫璞★紝鍒欏簲璇ヤ嬌鐢?Collections.synchronizedMap 鏂規硶鏉?#8220;鍖呰”璇ユ槧灝勩傛渶濂藉湪鍒涘緩鏃跺畬鎴愯繖涓鎿嶄綔錛屼互闃叉鎰忓鐨勯潪鍚屾璁塊棶銆?<br /> <br /> <span style="font-size: large"><strong>LinkedHashMap</strong></span> <br /> <br /> 閬嶅巻HashMap鎵寰楀埌鐨勬暟鎹槸鏉備貢鏃犵珷鐨勶紝榪欏湪鏌愪簺鎯呭喌涓嬪鎴烽渶瑕佺壒瀹氶亶鍘嗛『搴忔椂鏄崄鍒嗘湁鐢ㄧ殑銆傛瘮濡傦紝榪欑鏁版嵁緇撴瀯寰堥傚悎鏋勫緩 LRU 緙撳瓨銆傝皟鐢?put 鎴?get 鏂規硶灝嗕細璁塊棶鐩稿簲鐨勬潯鐩紙鍋囧畾璋冪敤瀹屾垚鍚庡畠榪樺瓨鍦級銆俻utAll 鏂規硶浠ユ寚瀹氭槧灝勭殑鏉$洰闆嗗悎榪唬鍣ㄦ彁渚涚殑閿?鍊兼槧灝勫叧緋葷殑欏哄簭錛屼負鎸囧畾鏄犲皠鐨勬瘡涓槧灝勫叧緋葷敓鎴愪竴涓潯鐩闂係un鎻愪緵鐨凧2SE璇存槑鏂囨。鐗瑰埆瑙勫畾浠諱綍鍏朵粬鏂規硶鍧囦笉鐢熸垚鏉$洰璁塊棶錛屽挨鍏訛紝collection 闆嗗悎綾葷殑鎿嶄綔涓嶄細褰卞搷搴曞眰鏄犲皠鐨勮凱浠i『搴忋?<br /> <br /> LinkedHashMap鐨勫疄鐜頒笌 HashMap 鐨勪笉鍚屼箣澶勫湪浜庯紝鍓嶈呯淮鎶ょ潃涓涓繍琛屼簬鎵鏈夋潯鐩殑鍙岄噸閾炬帴鍒楄〃銆傛閾炬帴鍒楄〃瀹氫箟浜嗚凱浠i『搴忥紝璇ヨ凱浠i『搴忛氬父灝辨槸闆嗗悎涓厓绱犵殑鎻掑叆欏哄簭銆傝綾誨畾涔変簡header銆乥efore涓巃fter涓変釜灞炴ф潵琛ㄧず璇ラ泦鍚堢被鐨勫ご涓庡墠鍚?#8220;鎸囬拡”錛屽叾鍏蜂綋鐢ㄦ硶綾諱技浜庢暟鎹粨鏋勪腑鐨勫弻閾捐〃錛屼互鍒犻櫎鏌愪釜鍏冪礌涓轟緥錛?<br /> <br /> <div id="wluihkn" class="dp-highlighter"> <div id="ikuikvn" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="vxlcbas" class="keyword">private</span><span> </span><span id="ylkyiew" class="keyword">void</span><span> remove() {   </span></span> <li><span>       before.after = after;   </span> <li><span>       after.before = before;   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">private void remove() { before.after = after; after.before = before; }</pre> <br /> <br /> 瀹為檯涓婂氨鏄敼鍙樺墠鍚庢寚閽堟墍鎸囧悜鐨勫厓绱犮?<br /> <br /> 鏄劇劧錛岀敱浜庡鍔犱簡緇存姢閾炬帴鍒楄〃鐨勫紑鏀紝鍏舵ц兘瑕佹瘮 HashMap 紼嶉婁竴絳癸紝涓嶈繃鏈変竴鐐逛緥澶栵細LinkedHashMap鐨勮凱浠f墍闇鏃墮棿涓庡叾鐨勬墍鍖呭惈鐨勫厓绱犳垚姣斾緥錛涜孒ashMap 榪唬鏃墮棿寰堝彲鑳藉紑鏀緝澶э紝鍥犱負瀹冩墍闇瑕佺殑鏃墮棿涓庡叾瀹歸噺錛堝垎閰嶇粰Key絀洪棿鐨勯暱搴︼級鎴愭瘮渚嬨備竴璦浠ヨ斀涔嬶紝闅忔満瀛樺彇鐢℉ashMap錛岄『搴忓瓨鍙栨垨鏄亶鍘嗙敤LinkedHashMap銆?<br /> <br /> LinkedHashMap榪橀噸鍐欎簡removeEldestEntry鏂規硶浠ュ疄鐜拌嚜鍔ㄦ竻闄よ繃鏈熸暟鎹殑鍔熻兘錛岃繖鍦℉ashMap涓槸鏃犳硶瀹炵幇鐨勶紝鍥犱負鍚庤呭叾鍐呴儴鐨勫厓绱犳槸鏃犲簭鐨勩傞粯璁ゆ儏鍐典笅錛孡inkedHashMap涓殑removeEldestEntry鐨勪綔鐢ㄨ鍏抽棴錛屽叾鍏蜂綋瀹炵幇濡備笅錛?<br /> <br /> <div id="uhcilsk" class="dp-highlighter"> <div id="uscmwhz" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="ejtlvcy" class="keyword">protected</span><span> </span><span id="kxlznfm" class="keyword">boolean</span><span> removeEldestEntry(Map.Entry<K,V> eldest) {   </span></span> <li><span>    </span><span id="hjxwkyj" class="keyword">return</span><span> </span><span id="xofthoo" class="keyword">false</span><span>;   </span></span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; }</pre> <br /> <br /> 鍙互浣跨敤濡備笅鐨勪唬鐮佽鐩杛emoveEldestEntry錛?<br /> <br /> <div id="mzuedrq" class="dp-highlighter"> <div id="uwguelo" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="bzyxsvy" class="keyword">private</span><span> </span><span id="moyxpwv" class="keyword">static</span><span> </span><span id="aumednq" class="keyword">final</span><span> </span><span id="mofesgr" class="keyword">int</span><span> MAX_ENTRIES = </span><span id="ziojxhz" class="number">100</span><span>;   </span></span> <li><span>  </span> <li><span id="jlrytad" class="keyword">protected</span><span> </span><span id="puagyma" class="keyword">boolean</span><span> removeEldestEntry(Map.Entry eldest) {   </span></span> <li><span>    </span><span id="tvythku" class="keyword">return</span><span> size() > MAX_ENTRIES;   </span></span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">private static final int MAX_ENTRIES = 100; protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_ENTRIES; } </pre> <br /> <br /> 瀹冭〃紺猴紝鍒氬紑濮嬶紝LinkedHashMap涓殑鍏冪礌涓嶆柇澧為暱錛涘綋瀹冨唴閮ㄧ殑鍏冪礌瓚呰繃MAX_ENTRIES錛?00錛夊悗錛屾瘡褰撴湁鏂扮殑鍏冪礌琚彃鍏ユ椂錛岄兘浼氳嚜鍔ㄥ垹闄ゅ弻閾捐〃涓渶鍓嶇錛堟渶鏃э級鐨勫厓绱狅紝浠庤屼繚鎸丩inkedHashMap鐨勯暱搴︾ǔ瀹氥?<br /> <br /> 緙虹渷鎯呭喌涓嬶紝LinkedHashMap閲囧彇鐨勬洿鏂扮瓥鐣ユ槸綾諱技浜庨槦鍒楃殑FIFO錛屽鏋滀綘鎯沖疄鐜版洿澶嶆潅鐨勬洿鏂伴昏緫姣斿LRU錛堟渶榪戞渶灝戜嬌鐢級 絳夛紝鍙互鍦ㄦ瀯閫犲嚱鏁頒腑鎸囧畾鍏禷ccessOrder涓簍rue錛屽洜涓虹殑璁塊棶鍏冪礌鐨勬柟娉曪紙get錛夊唴閮ㄤ細璋冪敤涓涓?#8220;閽╁瓙”錛屽嵆recordAccess錛屽叾鍏蜂綋瀹炵幇濡備笅錛?<br /> <br /> <div id="fwocxps" class="dp-highlighter"> <div id="kutavcu" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="hyesymi" class="keyword">void</span><span> recordAccess(HashMap<K,V> m) {   </span></span> <li><span>    LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;   </span> <li><span>    </span><span id="dytwknf" class="keyword">if</span><span> (lm.accessOrder) {   </span></span> <li><span>        lm.modCount++;   </span> <li><span>        remove();   </span> <li><span>        addBefore(lm.header);   </span> <li><span>    }   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } }</pre> <br /> <br /> 涓婅堪浠g爜涓昏瀹炵幇浜嗚繖鏍風殑鍔熻兘錛氬鏋渁ccessOrder琚緗負true錛屽垯姣忔璁塊棶鍏冪礌鏃訛紝閮藉皢璇ュ厓绱犵Щ鑷砲eadr鐨勫墠闈紝鍗抽摼琛ㄧ殑灝鵑儴銆傚皢removeEldestEntry涓巃ccessOrder涓璧蜂嬌鐢紝灝卞彲浠ュ疄鐜版渶鍩烘湰鐨勫唴瀛樼紦瀛橈紝鍏蜂綋浠g爜鍙弬鑰?a target=_blank><em>http://bluepopopo.javaeye.com/blog/180236</em></a>銆?<br /> <br /> <span style="font-size: large"><strong>WeakHashMap</strong></span> <br /> <br /> 99%鐨凧AVA鏁欐潗鏁欏鎴戜滑涓嶈鍘誨共棰凧VM鐨勫瀮鍦懼洖鏀舵満鍒訛紝浣咼AVA涓‘瀹炲瓨鍦ㄧ潃涓庡叾瀵嗗垏鐩稿叧鐨勫洓縐嶅紩鐢細寮哄紩鐢ㄣ佽蔣寮曠敤銆佸急寮曠敤浠ュ強騫昏薄寮曠敤銆?<br /> <br /> JAVA涓粯璁ょ殑HashMap閲囩敤鐨勬槸閲囩敤綾諱技浜庡己寮曠敤鐨勫己閿潵綆$悊鐨勶紝榪欐剰鍛崇潃鍗充嬌浣滀負key鐨勫璞″凡緇忎笉瀛樺湪浜嗭紙鎸囨病鏈変換浣曚竴涓紩鐢ㄦ寚鍚戝畠錛夛紝涔熶粛鐒朵細淇濈暀鍦℉ashMap涓紝鍦ㄦ煇浜涙儏鍐典笅錛堜緥濡傚唴瀛樼紦瀛橈級涓紝榪欎簺榪囨湡鐨勬潯鐩彲鑳戒細閫犳垚鍐呭瓨娉勬紡絳夐棶棰樸?<br /> <br /> WeakHashMap閲囩敤鐨勭瓥鐣ユ槸錛屽彧瑕佷綔涓簁ey鐨勫璞″凡緇忎笉瀛樺湪浜嗭紙瓚呭嚭鐢熷懡鍛ㄦ湡錛夛紝灝變笉浼氶樆姝㈠瀮鍦炬敹闆嗗櫒娓呯┖姝ゆ潯鐩紝鍗充嬌褰撳墠鏈哄櫒鐨勫唴瀛樺茍涓嶇揣寮犮備笉榪囷紝鐢變簬GC鏄竴涓紭鍏堢駭寰堜綆鐨勭嚎紼嬶紝鍥犳涓嶄竴瀹氫細寰堝揩鍙戠幇閭d簺鍙叿鏈夊急寮曠敤鐨勫璞★紝闄ら潪浣犳樉紺哄湴璋冪敤瀹冿紝鍙互鍙傝冧笅闈㈢殑渚嬪瓙錛?<br /> <br /> <div id="zmskjmt" class="dp-highlighter"> <div id="tgmhvcf" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="fhvqaoc" class="keyword">public</span><span> </span><span id="qsrfmah" class="keyword">static</span><span> </span><span id="lnxavcf" class="keyword">void</span><span> main(String[] args) {   </span></span> <li><span>    Map<String, String>map = </span><span id="tocmwoc" class="keyword">new</span><span> WeakHashMap<String, String>();   </span></span> <li><span>    map.put(</span><span id="yavypsr" class="keyword">new</span><span> String(</span><span id="enmhnmi" class="string">"Alibaba"</span><span>), </span><span id="agfporj" class="string">"alibaba"</span><span>);   </span></span> <li><span>    </span><span id="auiwgnu" class="keyword">while</span><span> (map.containsKey(</span><span id="wjaorjq" class="string">"Alibaba"</span><span>)) {   </span></span> <li><span>        </span><span id="dymhkgn" class="keyword">try</span><span> {   </span></span> <li><span>            Thread.sleep(</span><span id="kxhguxe" class="number">500</span><span>);   </span></span> <li><span>         } </span><span id="vtdcpsg" class="keyword">catch</span><span> (InterruptedException ignored) {   </span></span> <li><span>         }   </span> <li><span>         System.out.println(</span><span id="aymlvyq" class="string">"Checking for empty"</span><span>);   </span></span> <li><span>         System.gc();   </span> <li><span>    }  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">public static void main(String[] args) { Map<String, String>map = new WeakHashMap<String, String>(); map.put(new String("Alibaba"), "alibaba"); while (map.containsKey("Alibaba")) { try { Thread.sleep(500); } catch (InterruptedException ignored) { } System.out.println("Checking for empty"); System.gc(); } </pre> <br /> <br /> 涓婅堪浠g爜杈撳嚭涓嬈hecking for empty灝遍鍑轟簡涓葷嚎紼嬶紝鎰忓懗鐫GC鍦ㄦ渶榪戠殑涓嬈″瀮鍦懼洖鏀跺懆鏈熶腑娓呴櫎浜唍ew String(“Alibaba”),鍚屾椂WeakHashMap涔熷仛鍑轟簡鍙婃椂鐨勫弽搴旓紝灝嗚閿搴旂殑鏉$洰鍒犻櫎浜嗐傚鏋滃皢map鐨勭被鍨嬫敼涓篐ashMap鐨勮瘽錛岀敱浜庡叾鍐呴儴閲囩敤鐨勬槸寮哄紩鐢ㄦ満鍒訛紝鍥犳鍗充嬌GC琚樉紺鴻皟鐢紝map涓殑鏉$洰渚濈劧瀛樺湪錛岀▼搴忎細涓嶆柇鍦版墦鍑篊hecking for empty瀛楁牱銆傚彟澶栵紝鍦ㄤ嬌鐢╓eakHashMap鐨勬儏鍐典笅錛岃嫢鏄皢 <br /> <br /> <div id="rthrbil" class="dp-highlighter"> <div id="hnilryf" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span>map.put(</span><span id="prfidcj" class="keyword">new</span><span> String(</span><span id="wjtwrbt" class="string">"Alibaba"</span><span>), </span><span id="oqthvjm" class="string">"alibaba"</span><span>);   </span></span> </li> </ol> </div> <pre class="java" style="display: none" name="code">map.put(new String("Alibaba"), "alibaba"); </pre> <br /> <br /> 鏀逛負 <br /> <br /> <div id="bkuisdc" class="dp-highlighter"> <div id="qonxsrn" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span>map.put(</span><span id="yectwvn" class="string">"Alibaba"</span><span>, </span><span id="nlzuald" class="string">"alibaba"</span><span>);   </span></span> </li> </ol> </div> <pre class="java" style="display: none" name="code">map.put("Alibaba", "alibaba"); </pre> <br /> <br /> 紼嬪簭榪樻槸浼氫笉鏂緭鍑篊hecking for empty銆傝繖涓庡墠闈㈡垜浠垎鏋愮殑WeakHashMap鐨勫急寮曠敤鏈哄埗騫朵笉鐭涚浘錛屽洜涓篔VM涓轟簡鍑忓皬閲嶅鍒涘緩鍜岀淮鎶ゅ涓浉鍚孲tring鐨勫紑閿錛屽叾鍐呴儴閲囩敤浜嗚潎閲忔ā寮忥紙銆奐AVA涓庢ā寮忋嬶級錛屾鏃剁殑“Alibaba”鏄瓨鏀懼湪甯擱噺姹犺岄潪鍫嗕腑鐨勶紝鍥犳鍗充嬌娌℃湁瀵硅薄鎸囧悜“Alibaba”錛屽畠涔熶笉浼氳GC鍥炴敹銆傚急寮曠敤鐗瑰埆閫傚悎浠ヤ笅瀵硅薄錛氬崰鐢ㄥぇ閲忓唴瀛橈紝浣嗛氳繃鍨冨溇鍥炴敹鍔熻兘鍥炴敹浠ュ悗寰堝鏄撻噸鏂板垱寤恒?<br /> <br /> 浠嬩簬HashMap鍜學eakHashMap涔嬩腑鐨勬槸SoftHashMap錛屽畠鎵閲囩敤鐨勮蔣寮曠敤鐨勭瓥鐣ユ寚鐨勬槸錛屽瀮鍦炬敹闆嗗櫒騫朵笉鍍忓叾鏀墮泦寮卞彲鍙婄殑瀵硅薄涓鏍峰敖閲忓湴鏀墮泦杞彲鍙婄殑瀵硅薄錛岀浉鍙嶏紝瀹冨彧鍦ㄧ湡姝?“闇瑕?#8221; 鍐呭瓨鏃舵墠鏀墮泦杞彲鍙婄殑瀵硅薄銆傝蔣寮曠敤瀵逛簬鍨冨溇鏀墮泦鍣ㄦ潵璇存槸涓縐?#8220;鐫佷竴鍙溂錛岄棴涓鍙溂”鏂瑰紡錛屽嵆 “鍙鍐呭瓨涓嶅お绱у紶錛屾垜灝變細淇濈暀璇ュ璞°備絾鏄鏋滃唴瀛樺彉寰楃湡姝g揣寮犱簡錛屾垜灝變細鍘繪敹闆嗗茍澶勭悊榪欎釜瀵硅薄銆?#8221; 灝辮繖涓鐐圭湅錛屽畠鍏跺疄瑕佹瘮WeakHashMap鏇撮傚悎浜庡疄鐜扮紦瀛樻満鍒躲傞仐鎲劇殑鏄紝JAVA涓茍娌℃湁瀹炵幇鐩稿叧鐨凷oftHashMap綾伙紙Apache鍜孏oogle鎻愪緵浜嗙涓夋柟鐨勫疄鐜幫級錛屼絾瀹冨嵈鏄彁渚涗簡涓や釜鍗佸垎閲嶈鐨勭被java.lang.ref.SoftReference浠ュ強ReferenceQueue錛屽彲浠ュ湪瀵硅薄搴旂敤鐘舵佸彂鐢熸敼鍙樻槸寰楀埌閫氱煡錛屽彲浠ュ弬鑰僣om.alibaba.common.collection.SofthashMap涓璸rocessQueue鏂規硶鐨勫疄鐜? <br /> <br /> <div id="ikqtsov" class="dp-highlighter"> <div id="gedyxah" class="tools"><a title="澶嶅埗浠g爜" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" >Java浠g爜錛?/a></div> <ol class="dp-j"> <li><span><span id="ahciwzg" class="keyword">private</span><span> ReferenceQueue queue = </span><span id="lytocqe" class="keyword">new</span><span> ReferenceQueue();   </span></span> <li><span>ValueCell vc;   </span> <li><span>Map hash = </span><span id="giwvfil" class="keyword">new</span><span> HashMap(initialCapacity, loadFactor);   </span></span> <li><span>……   </span> <li><span id="xkuihky" class="keyword">while</span><span> ((vc = (ValueCell) queue.poll()) != </span><span id="ljihvyx" class="keyword">null</span><span>) {   </span></span> <li><span id="rmsnbmi" class="keyword">if</span><span> (vc.isValid()) {   </span></span> <li><span>          hash.remove(vc.key);   </span> <li><span>           } </span><span id="qsytldc" class="keyword">else</span><span> {   </span></span> <li><span>             valueCell.dropped--;   </span> <li><span>           }   </span> <li><span>}   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" style="display: none" name="code">private ReferenceQueue queue = new ReferenceQueue(); ValueCell vc; Map hash = new HashMap(initialCapacity, loadFactor); …… while ((vc = (ValueCell) queue.poll()) != null) { if (vc.isValid()) { hash.remove(vc.key); } else { valueCell.dropped--; } } }</pre> <br /> <br /> processQueue鏂規硶浼氬湪鍑犱箮鎵鏈塖oftHashMap鐨勬柟娉曚腑琚皟鐢ㄥ埌錛孞VM浼氶氳繃ReferenceQueue鐨刾oll鏂規硶閫氱煡璇ュ璞″凡緇忚繃鏈熷茍涓斿綋鍓嶇殑鍐呭瓨鐜扮姸闇瑕佸皢瀹冮噴鏀撅紝姝ゆ椂鎴戜滑灝卞彲浠ュ皢鍏朵粠hashMap涓墧闄ゃ備簨瀹炰笂錛岄粯璁ゆ儏鍐典笅錛孉libaba鐨凪emoryCache鎵浣跨敤鐨勫氨鏄疭oftHashMap銆?<br /> <br /> 鏉ユ簮錛?a >http://grunt1223.javaeye.com/blog/544497</a><br /> <img src ="http://www.tkk7.com/ArcticOcean/aggbug/328316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ArcticOcean/" target="_blank">Cool Jazz</a> 2010-08-09 15:14 <a href="http://www.tkk7.com/ArcticOcean/archive/2010/08/09/328316.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> 主站蜘蛛池模板: <a href="http://whspmd.com" target="_blank">怡红院免费的全部视频</a>| <a href="http://1880531.com" target="_blank">亚洲色图国产精品</a>| <a href="http://hn-hshb.com" target="_blank">亚洲国产一级在线观看</a>| <a href="http://maomaots.com" target="_blank">国产一级淫片a视频免费观看</a>| <a href="http://tjtangpu.com" target="_blank">女人被男人躁的女爽免费视频</a>| <a href="http://conghui8.com" target="_blank">成人免费a级毛片</a>| <a href="http://sdsxyz.com" target="_blank">成年人免费网站在线观看</a>| <a href="http://xjscr.com" target="_blank">成人免费a级毛片无码网站入口</a>| <a href="http://yzxjk.com" target="_blank">成人免费午夜无码视频 </a>| <a href="http://shrongshan.com" target="_blank">亚洲美女免费视频</a>| <a href="http://whxhjc.com" target="_blank">亚洲黄色三级网站</a>| <a href="http://yqstickers.com" target="_blank">亚洲无限乱码一二三四区</a>| <a href="http://meyume.com" target="_blank">亚洲国产成人精品青青草原</a>| <a href="http://hairdehf.com" target="_blank">亚洲宅男天堂a在线</a>| <a href="http://fphs666.com" target="_blank">国产精品久久亚洲不卡动漫</a>| <a href="http://ytshdiping.com" target="_blank">国产日本亚洲一区二区三区</a>| <a href="http://116603a.com" target="_blank">亚洲高清国产拍精品熟女</a>| <a href="http://513573.com" target="_blank">亚洲av成人一区二区三区在线播放 </a>| <a href="http://ahjmdd.com" target="_blank">88xx成人永久免费观看</a>| <a href="http://5079157.com" target="_blank">在线看片v免费观看视频777</a>| <a href="http://fcw70.com" target="_blank">成人网站免费观看</a>| <a href="http://35469642.com" target="_blank">国产亚洲福利一区二区免费看</a>| <a href="http://iciap.com" target="_blank">亚洲AV无码不卡在线观看下载</a>| <a href="http://cuuka.com" target="_blank">亚洲熟妇av一区二区三区</a>| <a href="http://www-566846.com" target="_blank">久久亚洲精品AB无码播放</a>| <a href="http://56p6.com" target="_blank">亚洲熟妇色自偷自拍另类</a>| <a href="http://hgbookvip.com" target="_blank">亚洲五月丁香综合视频</a>| <a href="http://wwwbu610.com" target="_blank">无码一区二区三区亚洲人妻</a>| <a href="http://mangaou.com" target="_blank">一级做α爱过程免费视频</a>| <a href="http://mtripmall.com" target="_blank">毛片在线播放免费观看</a>| <a href="http://cswangli.com" target="_blank">69天堂人成无码麻豆免费视频</a>| <a href="http://ynrygc.com" target="_blank">午夜dj免费在线观看</a>| <a href="http://shadaiym.com" target="_blank">亚洲男女内射在线播放</a>| <a href="http://www-92109.com" target="_blank">亚洲电影中文字幕</a>| <a href="http://9981tv.com" target="_blank">国产亚洲中文日本不卡二区</a>| <a href="http://liuxilife.com" target="_blank">黄页网址大全免费观看12网站</a>| <a href="http://gisdn.com" target="_blank">国产日韩AV免费无码一区二区</a>| <a href="http://513net.com" target="_blank">无码国产精品一区二区免费式影视</a>| <a href="http://yuejiju.com" target="_blank">日本高清免费中文字幕不卡</a>| <a href="http://wwwbu610.com" target="_blank">中文字幕亚洲图片</a>| <a href="http://cin17.com" target="_blank">亚洲六月丁香六月婷婷蜜芽</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>