"/>

婧愮爜鍒嗘瀽涔?--HashMap鏌ユ壘銆佸垹闄ゃ€侀亶鍘?/h1>

Posted 绋嬪簭鐚垮垎浜祫婧愭睜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了婧愮爜鍒嗘瀽涔?--HashMap鏌ユ壘銆佸垹闄ゃ€侀亶鍘?/h1>

相关的知识,希望对你有一定的参考价值。

鎸佺画鍧氭寔鍘熷垱杈撳嚭锛岀偣鍑昏摑瀛楀叧娉ㄦ垜鍚?/span>

鉂?/span>

娌夋穩銆佸垎浜€佹垚闀匡紝璁╄嚜宸卞拰浠栦汉閮借兘鏈夋墍鏀惰幏锛侌煒?/p> 鉂?/span>

鐩綍


  • 涓€銆佸墠瑷€

  • 浜屻€丠ashMap婧愮爜鍒嗘瀽

    • 1.  鎻掑叆

    • 2. 鏌ユ壘

    • 3. 鍒犻櫎

    • 4. 閬嶅巻

  • 涓夈€佹€荤粨


涓€銆佸墠瑷€

鍦ㄤ笂涓€绔犺妭鎴戜滑璁茶В骞剁敤鏁版嵁楠岃瘉浜嗭紝HashMap涓殑锛?code class="mq-25">鏁e垪琛ㄧ殑瀹炵幇銆?code class="mq-26">鎵板姩鍑芥暟銆?code class="mq-27">璐熻浇鍥犲瓙浠ュ強鎵╁鎷嗗垎绛夋牳蹇冪煡璇嗙偣浠ュ強鐩稿簲鐨勪綔鐢ㄣ€?/p>

闄や簡浠ヤ笂杩欎簺鐭ヨ瘑鐐瑰锛孒ashMap杩樻湁鍩烘湰鐨勬暟鎹姛鑳斤紱瀛樺偍銆?code class="mq-31">鍒犻櫎銆?code class="mq-32">鑾峰彇銆?code class="mq-33">閬嶅巻锛屽湪杩欎簺鍔熻兘涓粡甯镐細鍚埌閾捐〃銆佺孩榛戞爲銆佷箣闂磋浆鎹㈢瓑鍔熻兘銆傝€岀孩榛戞爲鏄湪jdk1.8寮曞叆鍒癏ashMap涓В鍐抽摼琛ㄨ繃闀块棶棰樼殑锛岀畝鍗曡褰撻摼琛ㄩ暱搴?code class="mq-34">>=8鏃讹紝灏嗛摼琛ㄨ浆鎹负绾㈤粦鏍?褰撶劧杩欓噷杩樻湁涓€涓墿瀹圭殑鐭ヨ瘑鐐癸紝涓嶄竴瀹氶兘浼氭爲鍖朳MIN_TREEIFY_CAPACITY])銆?/p>

閭d箞鏈珷鑺備細杩涜璁茶В浠ヤ笅鐭ヨ瘑鐐癸紱

  1. 鏁版嵁鎻掑叆娴佺▼鍜屾簮鐮佸垎鏋?
  2. 閾捐〃鏍戝寲浠ュ強鏍戣浆閾捐〃
  3. 閬嶅巻杩囩▼涓殑鏃犲簭Set鐨勬牳蹇冪煡璇?

銆岎煏垫敞鎰忥細銆?/strong> 寤鸿闃呰涓婁竴绡囧悗锛屽啀闃呰鏈瘒鏂囩珷

浜屻€丠ashMap婧愮爜鍒嗘瀽

1. 鏌ユ壘

婧愮爜鍒嗘瀽涔?--HashMap鏌ユ壘銆佸垹闄ゃ€侀亶鍘?> 
  <figcaption class= 鍏紬鍙凤細bugstack铏礊鏍堬紝HashMap鏌ユ壘娴佺▼鍥?

涓婂浘灏辨槸HashMap鏌ユ壘鐨勪竴涓祦绋嬪浘锛岃繕鏄瘮杈冪畝鍗曠殑锛屽悓鏃朵篃鏄珮鏁堢殑銆?/p>

鎺ヤ笅鏉ユ垜浠湪缁撳悎浠g爜锛屾潵鍒嗘瀽杩欐娴佺▼锛屽涓嬶紱

public V get(Object key) {
    Node<K,V> e;
    // 鍚屾牱闇€瑕佺粡杩囨壈鍔ㄥ嚱鏁拌绠楀搱甯屽€?/span>
    return (e = getNode(hash(key), key)) == null ? null : e.value;
}

final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    // 鍒ゆ柇妗舵暟缁勭殑鏄惁涓虹┖鍜岄暱搴﹀€?/span>
    if ((tab = table) != null && (n = tab.length) > 0 &&
        // 璁$畻涓嬫爣锛屽搱甯屽€间笌鏁扮粍闀垮害-1
        (first = tab[(n - 1) & hash]) != null) {
        if (first.hash == hash && // always check first node
            ((k = first.key) == key || (key != null && key.equals(k))))
            return first;
        if ((e = first.next) != null) {
            // TreeNode 鑺傜偣鐩存帴璋冪敤绾㈤粦鏍戠殑鏌ユ壘鏂规硶锛屾椂闂村鏉傚害O(logn)
            if (first instanceof TreeNode)
                return ((TreeNode<K,V>)first).getTreeNode(hash, key);
            // 濡傛灉鏄摼琛ㄥ氨渚濇閬嶅巻鏌ユ壘
            do {
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    return e;
            } while ((e = e.next) != null);
        }
    }
    return null;
}

浠ヤ笂鏌ユ壘鐨勪唬鐮佽繕鏄瘮杈冪畝鍗曠殑锛屼富瑕佸寘鎷互涓嬬煡璇嗙偣锛?/p>

  1. 鎵板姩鍑芥暟鐨勪娇鐢紝鑾峰彇鏂扮殑鍝堝笇鍊硷紝杩欏湪涓婁竴绔犺妭宸茬粡璁茶繃
  2. 涓嬫爣鐨勮绠楋紝鍚屾牱涔熶粙缁嶈繃 tab[(n - 1) & hash])
  3. 纭畾浜嗘《鏁扮粍涓嬫爣浣嶇疆锛屾帴涓嬫潵灏辨槸瀵圭孩榛戞爲鍜岄摼琛ㄨ繘琛屾煡鎵惧拰閬嶅巻鎿嶄綔浜?

3. 鍒犻櫎

 public V remove(Object key) {
     Node<K,V> e;
     return (e = removeNode(hash(key), key, nullfalsetrue)) == null ?
         null : e.value;
 }
 
final Node<K,V> removeNode(int hash, Object key, Object value,
                           boolean matchValue, boolean movable)
 
{
    Node<K,V>[] tab; Node<K,V> p; int n, index;
    // 瀹氫綅妗舵暟缁勪腑鐨勪笅鏍囦綅缃紝index = (n - 1) & hash
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (p = tab[index = (n - 1) & hash]) != null) {
        Node<K,V> node = null, e; K k; V v;
        // 濡傛灉閿殑鍊间笌閾捐〃绗竴涓妭鐐圭浉绛夛紝鍒欏皢 node 鎸囧悜璇ヨ妭鐐?/span>
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
            node = p;
        else if ((e = p.next) != null) {
            // 鏍戣妭鐐癸紝璋冪敤绾㈤粦鏍戠殑鏌ユ壘鏂规硶锛屽畾浣嶈妭鐐广€?/span>
            if (p instanceof TreeNode)
                node = ((TreeNode<K,V>)p).getTreeNode(hash, key);
            else {
                // 閬嶅巻閾捐〃锛屾壘鍒板緟鍒犻櫎鑺傜偣
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key ||
                         (key != null && key.equals(k)))) {
                        node = e;
                        break;
                    }
                    p = e;
                } while ((e = e.next) != null);
            }
        }
        
        // 鍒犻櫎鑺傜偣锛屼互鍙婄孩榛戞爲闇€瑕佷慨澶嶏紝鍥犱负鍒犻櫎鍚庝細鐮村潖骞宠 鎬с€傞摼琛ㄧ殑鍒犻櫎鏇村姞绠€鍗曘€?/span>
        if (node != null && (!matchValue || (v = node.value) == value ||
                             (value != null && value.equals(v)))) {
            if (node instanceof TreeNode)
                ((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
            else if (node == p)
                tab[index] = node.next;
            else
                p.next = node.next;
            ++modCount;
            --size;
            afterNodeRemoval(node);
            return node;
        }
    }
    return null;

  • 鍒犻櫎鐨勬搷浣滀篃姣旇緝绠€鍗曪紝杩欓噷闈㈤兘娌℃湁澶鐨勫鏉傜殑閫昏緫銆?
  • 鍙﹀绾㈤粦鏍戠殑鎿嶄綔鍥犱负琚寘瑁呬簡锛屽彧鐪嬩娇鐢ㄤ笂涔熸槸寰堝鏄撱€?

4. 閬嶅巻

4.1 闂鐐?/span>

HashMap涓殑閬嶅巻涔熸槸闈炲父甯哥敤鐨凙PI鏂规硶锛屽寘鎷紱

銆孠eySet銆?/strong>

 for (String key : map.keySet()) {
     System.out.print(key + " ");
 }

銆孍ntrySet銆?/strong>

 for (HashMap.Entry entry : map.entrySet()) {
     System.out.print(entry + " ");
 }

浠庢柟娉曚笂浠ュ強鏃ュ父浣跨敤閮界煡閬擄紝KeySet鏄亶鍘嗘槸鏃犲簭鐨勶紝浣嗘瘡娆′娇鐢ㄤ笉鍚屾柟寮忛亶鍘嗗寘鎷?code class="mq-195">keys.iterator()锛屽畠浠亶鍘嗙殑缁撴灉鏄浐瀹氱殑銆?/p>

閭d箞浠庡疄鐜扮殑瑙掑害鏉ョ湅锛岃繖浜涚閬嶅巻閮芥槸浠庢暎鍒楄〃涓殑閾捐〃鍜岀孩榛戞爲鑾峰彇闆嗗悎鍊硷紝閭d箞浠栦滑鏈変竴涓粈涔堝浐瀹氱殑瑙勫緥鍚楋紵

4.2 鐢ㄤ唬鐮佹祴璇?/span>

娴嬭瘯鐨勫満鏅拰鍓嶆彁锛?/p>

  1. 杩欓噷鎴戜滑瑕佽瀹氫竴涓棦鏈夌孩榛戞爲鍙堟湁閾捐〃缁撴瀯鐨勬暟鎹満鏅?
  2. 涓轰簡鍙互鏈夎繖鏍风殑鏁版嵁缁撴瀯锛屾垜浠渶濂芥妸HashMap鐨勫垵濮嬮暱搴﹁瀹氫负64锛岄伩鍏嶅湪閾捐〃瓒呰繃8浣嶅悗鎵╁锛岃€屾槸鐩存帴璁╁叾杞崲涓虹孩榛戞爲銆?
  3. 鎵惧埌18涓厓绱狅紝鍒嗗埆鏀惧湪涓嶅悓鑺傜偣(杩欎簺鏁版嵁閫氳繃绋嬪簭璁$畻寰楁潵)锛?
    1. 妗舵暟缁?2鑺傜偣锛?4銆?6銆?8
    2. 妗舵暟缁?7鑺傜偣锛?9
    3. 妗舵暟缁?2鑺傜偣锛?50銆?72銆?94銆?71銆?93銆?70銆?92銆?91銆?90

銆屼唬鐮佹祴璇曘€?/strong>

@Test
public void test_Iterator() {
    Map<String, String> map = new HashMap<String, String>(64);
    map.put("24""Idx锛?");
    map.put("46""Idx锛?");
    map.put("68""Idx锛?");
    map.put("29""Idx锛?");
    map.put("150""Idx锛?2");
    map.put("172""Idx锛?2");
    map.put("194""Idx锛?2");
    map.put("271""Idx锛?2");
    System.out.println("鎺掑簭01锛?);
    for (String key : map.keySet()) {
        System.out.print(key + " ");
    }
    
    map.put("293""Idx锛?2");
    map.put("370""Idx锛?2");
    map.put("392""Idx锛?2");
    map.put("491""Idx锛?2");
    map.put("590""Idx锛?2");
    System.out.println(" 鎺掑簭02锛?);
    for (String key : map.keySet()) {
        System.out.print(key + " ");
    }    
    
    map.remove("293");
    map.remove("370");
    map.remove("392");
    map.remove("491");
    map.remove("590");
    System.out.println(" 鎺掑簭03锛?);
    for (String key : map.keySet()) {
        System.out.print(key + " ");
    }
    
}

杩欐浠g爜鍒嗗埆娴嬭瘯浜嗕笁绉嶅満鏅紝濡備笅锛?/p>

  1. 娣诲姞鍏冪礌锛屽湪HashMap杩樻槸鍙摼琛ㄧ粨鏋勬椂锛岃緭鍑烘祴璇曠粨鏋?1
  2. 娣诲姞鍏冪礌锛屽湪HashMap杞崲涓虹孩榛戞爲鏃跺€欙紝杈撳嚭娴嬭瘯缁撴灉02
  3. 鍒犻櫎鍏冪礌锛屽湪HashMap杞崲涓洪摼琛ㄧ粨鏋勬椂锛岃緭鍑烘祴璇曠粨鏋?3

4.3 娴嬭瘯缁撴灉鍒嗘瀽

鎺掑簭01锛?br>24 46 68 29 150 172 194 271 

鎺掑簭02锛?br>24 46 68 29 271 150 172 194 293 370 392 491 590 

鎺掑簭03锛?br>24 46 68 29 172 271 150 194 
Process finished with exit code 0

浠巑ap.keySet()娴嬭瘯缁撴灉鍙互鐪嬪埌锛屽涓嬩俊鎭紱

  1. 01鎯呭喌涓嬶紝鎺掑簭瀹氫綅鍝堝笇鍊间笅鏍囧拰閾捐〃淇℃伅
婧愮爜鍒嗘瀽涔?--HashMap鏌ユ壘銆佸垹闄ゃ€侀亶鍘?> 
  <figcaption class= 鍏紬鍙凤細bugstack铏礊鏍堬紝閾捐〃缁撴瀯
  1. 02鎯呭喌涓嬶紝鍥犱负閾捐〃杞崲涓虹孩榛戞爲锛屾爲鏍逛細绉诲姩鍒版暟缁勫ご閮ㄣ€? moveRootToFront()鏂规硶
鍏紬鍙凤細bugstack铏礊鏍堬紝閾捐〃鏍戝寲
  1. 03鎯呭喌涓嬶紝鍥犱负鍒犻櫎浜嗛儴鍒嗗厓绱狅紝绾㈤粦鏍戦€€鍖栨垚閾捐〃銆?
鍏紬鍙凤細bugstack铏礊鏍堬紝绾㈤粦鏍戣浆閾捐〃


以上是关于婧愮爜鍒嗘瀽涔?--HashMap鏌ユ壘銆佸垹闄ゃ€侀亶鍘?/h1>

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

AtomicInteger 婧愮爜鍒嗘瀽

ArrayList婧愮爜鍒嗘瀽

JDK婧愮爜鍒嗘瀽鍒濇鏁寸悊

log4j2婧愮爜鍒嗘瀽-1

绮惧敖 MyBatis 婧愮爜鍒嗘瀽 - SqlSession 浼氳瘽涓?SQL 鎵ц鍏ュ彛

鏁欏コ鏈嬪弸璇绘噦绯诲垪锛歞ubbo鐨勫彲鎵╁睍鏈哄埗SPI 婧愮爜鍒嗘瀽