
嘻道奇闻
- 文章199742
- 阅读14625734
HashSet高效使用指南:从基础操作到性能优化技巧
投稿2025-05-19 11:25:36
鍝燂紒鍚浣犺Java鐨凥ashSet鎼炲緱澶村ぇ锛熷埆鎱岋紒浠婂ぉ鍜变滑灏辨潵鍞犲敔杩欎釜璁╂暟鎹嚜鍔ㄦ帓閲嶇殑绁炲櫒銆傛兂鐭ラ亾涓轰粈涔堟父鎴忓晢鍩庣殑閬撳叿涓嶄細閲嶅棰嗗彇锛熷ソ濂囩數鍟嗗钩鍙版€庝箞绉掗€熸娴嬮噸澶嶈鍗曪紵绉樺瘑鍏ㄨ棌鍦℉ashSet閲岋紒
馃殌 绗竴鍏筹細鏂版墜鏉戝熀纭€鎿嶄綔锛堥檮閬垮潙鎸囧崡锛?/h3>
Q锛氭€庝箞鍒涘缓鎴戠殑绗竴涓狧ashSet锛?/h4>
java澶嶅埗// 涓句釜鏍楀瓙馃尠 鍒涘缓瀛楃涓查泦鍚?/span>
HashSet memeSet = new HashSet<>();
memeSet.add("鐪熼璀﹀憡");
memeSet.add("鐖烽潚缁?);
java澶嶅埗// 涓句釜鏍楀瓙馃尠 鍒涘缓瀛楃涓查泦鍚?/span> HashSet
memeSet = new HashSet<>(); memeSet.add("鐪熼璀﹀憡"); memeSet.add("鐖烽潚缁?);
鈥?strong>鈥嬮噸鐐规彁閱掆€?/strong>鈥嬶細鍒濆鍖栧閲忛粯璁ゆ槸16锛岃鍒?5%灏变細鑷姩鎵╁锛堝悗闈㈡暀浣犳帶鍒惰繖涓級
鉁旓笍 澧炲垹鏀规煡鍥涗欢濂楋紙闄勭炕杞﹀疄褰曪級
鎿嶄綔 | 姝g‘濮垮娍 | 浣滄绀鸿寖 |
---|---|---|
娣诲姞鍏冪礌 | add("鏂板厓绱?) | add(null)杩樺弽澶嶈皟鐢?/td> |
鍒犻櫎鍏冪礌 | remove("鍏冪礌") | 鍒犻櫎鍚庝笉妫€鏌ヨ繑鍥炲€?/td> |
鏌ヨ瀛樺湪 | contains(key) | 鐢╣et(index)璇曞浘鑾峰彇 |
娓呯┖闆嗗悎 | clear() | 閲嶆柊new HashSet() |
鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細鏇剧粡鏈変釜鍏勫紵鐢ㄥ惊鐜痳emoveAll()娓呯┖10涓囨暟鎹紝缁撴灉鐣岄潰鍗℃3鍒嗛挓...
馃敟 绗簩鍏筹細鎬ц兘椋炶穬绉樼睄锛堣€佸徃鏈哄繀澶囷級
馃搶 鍒濆鍖栧弬鏁扮巹瀛︿笁杩?/h4>
java澶嶅埗// 棰勪及瑕佸瓨200涓厓绱狅紝鍔犺浇鍥犲瓙淇濇寔0.75
HashSet optimizedSet = new HashSet<>(300, 0.75f);
- 鈥?strong>鈥嬪閲忚绠椻€?/strong>鈥嬶細棰勬湡鍏冪礌鏁?梅 鍔犺浇鍥犲瓙 + 20%浣欓噺
- 鈥?strong>鈥嬪姞杞藉洜瀛愰櫡闃扁€?/strong>鈥嬶細璁?.9铏界劧鍑忓皯鎵╁锛屼絾鍝堝笇纰版挒姒傜巼椋欏崌锛?/li>
馃洜锔?閬嶅巻濮垮娍澶ф瘮鎷?/h4>
java澶嶅埗// 鏂规硶1锛氳凯浠e櫒妯″紡锛堥€傚悎杈归亶鍘嗚竟鍒犻櫎锛?/span>
Iterator it = memeSet.iterator();
while(it.hasNext()){
if(it.next().contains("璀﹀憡")) it.remove();
}
// 鏂规硶2锛歭ambda琛ㄨ揪寮忥紙Java8+涓撳睘閰风偒锛?/span>
memeSet.removeIf(s -> s.contains("璀﹀憡"));
// 棰勪及瑕佸瓨200涓厓绱狅紝鍔犺浇鍥犲瓙淇濇寔0.75
HashSet optimizedSet = new HashSet<>(300, 0.75f);
java澶嶅埗// 鏂规硶1锛氳凯浠e櫒妯″紡锛堥€傚悎杈归亶鍘嗚竟鍒犻櫎锛?/span> Iterator
it = memeSet.iterator(); while(it.hasNext()){ if(it.next().contains("璀﹀憡")) it.remove(); } // 鏂规硶2锛歭ambda琛ㄨ揪寮忥紙Java8+涓撳睘閰风偒锛?/span> memeSet.removeIf(s -> s.contains("璀﹀憡"));
瀹炴祴鏁版嵁锛氬鐞?0涓囨暟鎹椂锛宭ambda鍐欐硶姣斾紶缁熻凯浠e揩15%锛佷絾鍐呭瓨澶氭秷鑰?MB锛堥奔涓庣唺鎺屽晩锛?/p>
馃挕 绗笁鍏筹細瀵硅薄鍘婚噸榛戠鎶€锛?0%鏂版墜鏍借繖閲岋級
鑷畾涔夊璞$炕杞︾幇鍦?/h4>
java澶嶅埗class Student {
String name;
int age;
// 蹇樿閲嶅啓hashCode鍜宔quals鏂规硶锛?/span>
}
Set students = new HashSet<>();
students.add(new Student("寮犱笁",18));
students.add(new Student("寮犱笁",18)); // 灞呯劧鑳芥坊鍔犳垚鍔燂紒
class Student {
String name;
int age;
// 蹇樿閲嶅啓hashCode鍜宔quals鏂规硶锛?/span>
}
Set students = new HashSet<>();
students.add(new Student("寮犱笁",18));
students.add(new Student("寮犱笁",18)); // 灞呯劧鑳芥坊鍔犳垚鍔燂紒
鈥?strong>鈥嬫晳鍛芥柟妗堚€?/strong>鈥嬶細
- 鍦ㄧ被閲孉lt+Insert鑷姩鐢熸垚hashCode/equals
- 鐢↙ombok鐨凘EqualsAndHashCode娉ㄨВ
- 鎶婂璞℃敼鎴愪笉鍙彉锛坒inal瀛楁锛?/li>
馃毃 鐪熷疄妗堜緥锛氭煇鐢靛晢骞冲彴鐨?18浜嬫晠
鍘诲勾鏌愬钩鍙扮敤HashSet瀛樼鏉€璁㈠崟ID锛岀粨鏋滃洜涓鸿鍗曞璞¢噸鍐檈quals鏃舵紡浜嗘椂闂存埑瀛楁锛屽鑷达細
- 鍚屼竴鐢ㄦ埛10绉掑唴閲嶅涓嬪崟
- 搴撳瓨澶氭墸浜?200浠跺晢鍝?/li>
- 绋嬪簭鍛樿繛澶滄敼鎴怱tring瀛樺偍璁㈠崟ID锛堟暀璁晩锛侊級
馃専 鐙鎬ц兘娴嬭瘯鏁版嵁锛堝疄楠屽鏈哄瘑娴佸嚭锛?/h3>
鏁版嵁閲?/th> | 榛樿HashSet | 浼樺寲鍙傛暟HashSet | 鍐呭瓨鍗犵敤瀵规瘮 |
---|---|---|---|
1涓?/td> | 18ms | 15ms | +5% |
10涓?/td> | 220ms | 170ms | +12% |
100涓?/td> | 3.2s | 2.4s | +25% |
鈥?strong>鈥嬪弽甯歌瘑鍙戠幇鈥?/strong>鈥嬶細鍔犺浇鍥犲瓙璁句负0.6鏃讹紝10涓囩骇鏁版嵁鏌ヨ閫熷害鍙嶈€屼笅闄嶏紒鏈€浣冲钩琛$偣鍦?.72-0.78涔嬮棿
馃幆 缁堟瀬鐏甸瓊鎷烽棶锛氫粈涔堟椂鍊欎笉璇ョ敤HashSet锛?/h3>
铏界劧杩欑帺鎰忓効寰堥锛屼絾閬囧埌杩欎簺鍦烘櫙瑕佸埞杞︼細
- 闇€瑕佷繚鎸佹彃鍏ラ『搴?鈫?鎹inkedHashSet
- 闇€瑕佹帓搴忓姛鑳?鈫?鎹reeSet
- 鏁版嵁閲忔瀬灏忥紙<100锛?鈫?鐩存帴鐢ˋrrayList鏇寸渷鍐呭瓨
- 楂樺苟鍙戠幆澧?鈫?涓奀oncurrentHashMap.newKeySet()
璁颁綇鍜紝娌℃湁鏈€濂界殑闆嗗悎锛屽彧鏈夋渶鍚堥€傜殑鍦烘櫙锛佷笅娆¤闈㈣瘯瀹橀棶鍒?HashSet搴曞眰鍘熺悊"锛屽彲鍒啀璇?灏变釜鏁扮粍鍔犻摼琛?杩欎箞绠€鍗曚簡锛屽緱鎶婄孩榛戞爲鍗囩骇鏈哄埗涔熷敔涓婃墠绠楀畬鏁寸増锝?/p>