{"id":2375,"date":"2022-10-23T21:37:03","date_gmt":"2022-10-23T13:37:03","guid":{"rendered":"http:\/\/47.101.202.111\/?p=2375"},"modified":"2022-10-24T22:26:16","modified_gmt":"2022-10-24T14:26:16","slug":"hashmap%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"http:\/\/139.196.114.170\/?p=2375","title":{"rendered":"HashMap\u6e90\u7801\u5206\u6790"},"content":{"rendered":"<h3>\u524d\u7f6e\u77e5\u8bc6\u70b9<\/h3>\n<p><a href=\"http:\/\/tihar-tech.cn\/?p=915\">Hash\u6563\u5217\u8868\u539f\u7406<\/a><br \/>\n<a href=\"http:\/\/tihar-tech.cn\/?p=2216\">RBT\u7ea2\u9ed1\u6811\u539f\u7406<\/a><\/p>\n<h3>\u6e90\u7801\u9010\u884c\u89e3\u6790<\/h3>\n<h4>\u4f18\u5316\u6280\u5de7\u603b\u7ed3<\/h4>\n<p>1\u3001\u6574\u6570\u4e58\u6cd5\u4f7f\u7528\u79fb\u4f4d\u8fd0\u7b97\u4ee3\u66ff\u4e58\u6cd5\u8fd0\u7b97\u63d0\u9ad8\u6548\u7387<br \/>\n2\u3001n\u4e3a2\u7684\u5e42\u6b21\u65f6\uff0c\u53ef\u7528(n &#8211; 1) &amp; hash\u4f4d\u8fd0\u7b97\u5b9e\u73b0\u53d6\u6a21\u8fd0\u7b97hash % n<br \/>\n3\u3001rehash\u65f6\uff0c\u4e8c\u6b21\u5e42\u6269\u5bb9\u673a\u5236\u4f7f\u5176\u53ef\u6839\u636e\u5947\u5076\u56e0\u5b50\u5feb\u901f\u5b9a\u4f4d\u65b0\u6563\u5217\u4f4d\u7f6e\uff0c\u8be6\u89c1\u4e0b\u8ff0resize()\u65b9\u6cd5<br \/>\n4\u3001\u65e0\u7b26\u53f7\u53f3\u79fb>>>\u548c\u6216\u8fd0\u7b97|\u7ed3\u5408\u53ef\u5728\u5bf9\u6570\u590d\u6742\u5ea6\u65f6\u95f4\u590d\u5236\u4f4d\uff0c\u8be6\u89c1\u4e0b\u8ff0tablesizefor()\u65b9\u6cd5<\/p>\n<h4>\u9ed8\u8ba4\u521d\u59cb\u503c<\/h4>\n<pre lang=\"java\">\n\/\/ \u54c8\u5e0c\u8868\u7684\u9ed8\u8ba4\u521d\u59cb\u5bb9\u91cf\nstatic final int DEFAULT_INITIAL_CAPACITY = 1 << 4;\n\/\/ \u54c8\u5e0c\u8868\u9ed8\u8ba4\u6700\u5927\u5bb9\u91cf\nstatic final int MAXIMUM_CAPACITY = 1 << 30;\n\/\/ \u54c8\u5e0c\u8868\u9ed8\u8ba4\u8d1f\u8f7d\u56e0\u5b50\nstatic final float DEFAULT_LOAD_FACTOR = 0.75f;\n\/\/ \u54c8\u5e0c\u51b2\u7a81\u62c9\u94fe\u6cd5\u8f6c\u7ea2\u9ed1\u6811\u7684\u9608\u503c\nstatic final int TREEIFY_THRESHOLD = 8;\n\/\/ \u94fe\u8868\u6811\u5316\u65f6\u6700\u5c0f\u54c8\u5e0c\u8868\u5bb9\u91cf\nstatic final int MIN_TREEIFY_CAPACITY = 64;\n<\/pre>\n<h4>\u6784\u9020\u65b9\u6cd5<\/h4>\n<p>\u65e0\u53c2\u6784\u9020\u6307\u5b9a\u9ed8\u8ba4\u8d1f\u8f7d\u56e0\u5b500.75<\/p>\n<pre lang=\"java\">\npublic HashMap() {\n    this.loadFactor = DEFAULT_LOAD_FACTOR;\n}\n<\/pre>\n<p>\u5355\u53c2\u6784\u9020\u81ea\u5b9a\u4e49\u521d\u59cb\u5bb9\u91cf\uff0c\u540e\u7eed\u9996\u6b21\u8c03\u7528put()\u65b9\u6cd5\u65f6\uff0c\u4f1a\u5c06\u5bb9\u91cf\u8bbe\u5b9a\u4e3a\u4e0d\u5c0f\u4e8e\u6307\u5b9a\u6570\u7684\u6700\u5c0f\u4e8c\u6b21\u5e42\uff0c\u9ed8\u8ba4\u8d1f\u8f7d\u56e0\u5b500.75<\/p>\n<pre lang=\"java\">\npublic HashMap(int initialCapacity) {\n    this(initialCapacity, DEFAULT_LOAD_FACTOR);\n}\n<\/pre>\n<p>\u6821\u9a8c\u53c2\u6570\u5408\u6cd5\u6027\uff0c\u5e76\u9650\u5236\u6700\u5927\u5bb9\u91cfMAXIMUM_CAPACITY<\/p>\n<pre lang=\"java\">\npublic HashMap(int initialCapacity, float loadFactor) {\n    if (initialCapacity < 0)\n        throw new IllegalArgumentException(\"Illegal initial capacity: \" +\n                initialCapacity);\n    if (initialCapacity > MAXIMUM_CAPACITY)\n        initialCapacity = MAXIMUM_CAPACITY;\n    if (loadFactor <= 0 || Float.isNaN(loadFactor))\n        throw new IllegalArgumentException(\"Illegal load factor: \" +\n                loadFactor);\n    this.loadFactor = loadFactor;\n    this.threshold = tableSizeFor(initialCapacity);\n}\n<\/pre>\n<p>tableSizeFor()\u65b9\u6cd5\u901a\u8fc7\u4f4d\u8fd0\u7b97\u83b7\u53d6\u4e0d\u5c0f\u4e8e\u5f53\u524d\u6570\u7684\u6700\u5c0f\u4e8c\u6b21\u5e42\u6570\uff0c\u901a\u8fc7\u5bf9\u6570\u6b21\u590d\u5236\u6700\u9ad8\u4f4d1\u83b7\u5f97\u4f4e\u4f4d\u51681\uff0c+1\u83b7\u5f97\u4e8c\u6b21\u5e42\u6570<\/p>\n<pre lang=\"java\">\nstatic final int tableSizeFor(int cap) {\n    int n = cap - 1;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;\n}\n<\/pre>\n<p>\u5176\u4e2dn=cap-1\u4fdd\u8bc1\u4e8c\u6b21\u5e42\u6570\u8fd0\u7b97\u540e\u662f\u81ea\u8eab\uff08\u89c1example=128\uff09<\/p>\n<p>cap=0\u65f6\uff0cn=cap-1 = -1\uff0c<br \/>\n$\\scriptsize -1=[1000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000]_2$\uff0c<br \/>\n\u4f4d\u8fd0\u7b97\u540e $\\scriptsize [1111\\ 1111\\ 1111\\ 1111\\ 1111\\ 1111\\ 1111\\ 1111]_2$\uff0c<br \/>\n$\\scriptsize n+1 = [1\\  0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000]_2$ \u4e22\u5f03\u9ad8\u4f4d\u4ecd\u662f0<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/tihar-tech.cn\/wp-content\/uploads\/2022\/10\/tablesizefor.png?w=525\" alt=\"tableforsize\" data-recalc-dims=\"1\" \/><\/p>\n<h4>put()\u65b9\u6cd5<\/h4>\n<p>put()\u65f6\u8ba1\u7b97key\u7684\u54c8\u5e0c\u503c\uff0c\u8f6c\u53bb\u6267\u884cputVal()<\/p>\n<pre lang=\"java\">\npublic V put(K key, V value) {\n    return putVal(hash(key), key, value, false, true);\n}\n<\/pre>\n<p>hash()\u503c\u8ba1\u7b97\uff0c\u4f7f\u7528\u9ed8\u8ba4\u6216\u8986\u5199\u7684hashCode()\u503c\uff0c\u5c06\u4f4e16\u4f4d\u548c\u9ad816\u4f4d\u5f02\u6216\u83b7\u5f97hash\uff0c\u540c\u65f6\u5229\u7528\u9ad8\u4f4e\u4f4d\u4fe1\u606f\u4ee5\u51cf\u5c11\u51b2\u7a81\uff08\u89c1\u6e90\u7801\u6ce8\u91ca\uff09<\/p>\n<pre lang=\"java\">\nstatic final int hash(Object key) {\n    int h;\n    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);\n}\n<\/pre>\n<p>putVal()\u4e3b\u8981\u5c06\u503c\u63d2\u5165\u54c8\u5e0c\u8868\uff0c\u9700\u8981\u5224\u7a7a\u3001\u5224\u5df2\u5b58\u5728\u3001\u5224\u65b0\u63d2\u5165\u8282\u70b9\u3001\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81<\/p>\n<pre lang=\"java\">\nfinal V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {\n    HashMap.Node<K,V>[] tab; HashMap.Node<K,V> p; int n, i;\n\n    \/\/ \u9996\u6b21put()\u521d\u59cb\u5316\u9ed8\u8ba4\u5bb9\u91cf\u4e3a16\uff0c\u9608\u503c12\n    if ((tab = table) == null || (n = tab.length) == 0)\n        n = (tab = resize()).length;\n\n    \/\/ \u8ba1\u7b97\u63d2\u5165\u4f4d\u7f6e\uff0c\u9996\u6b21\u63d2\u5165(\u672a\u51b2\u7a81)\u65b0\u5efa\u63d2\u5165\u8282\u70b9\n    if ((p = tab[i = (n - 1) & hash]) == null)\n        tab[i] = newNode(hash, key, value, null);\n\n    \/\/ \u63d2\u5165\u4f4d\u7f6e\u5df2\u6709\u8282\u70b9\u5219\u4e3a\u66f4\u65b0\u503c\u6216\u53d1\u751f\u51b2\u7a81\uff0c\u91c7\u7528\u62c9\u94fe\u6cd5\u6216\u7ea2\u9ed1\u6811\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\n    else {\n        HashMap.Node<K,V> e; K k;\n        \/\/ \u5df2\u5b58\u5728\u8282\u70b9\u5219\u8bb0\u5f55\u8be5\u8282\u70b9\uff0c\u4f9b\u540e\u7eed\u66f4\u65b0\u4e3a\u65b0\u503c\n        if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))\n            e = p;\n        \/\/ \u63d2\u5165\u4f4d\u7f6e\u4e3a\u6811\u8282\u70b9\uff0c\u82e5\u6811\u5df2\u5b58\u5728\u8282\u70b9\u5219\u8fd4\u56de\u8be5\u8282\u70b9\u4f9b\u540e\u7eed\u66f4\u65b0\u65b0\u503c\uff0c\u5426\u5219\u4e3a\u5e73\u8861\u63d2\u5165\u65b0\u8282\u70b9\u5230\u7ea2\u9ed1\u6811\uff0c\u8c03\u6574\u65b0root\u4e3a\u54c8\u5e0c\u51b2\u7a81\u94fe\u8868\u5165\u53e3\n        else if (p instanceof HashMap.TreeNode)\n            e = ((HashMap.TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);\n        \/\/ \u62c9\u94fe\u6cd5\u5c06\u51b2\u7a81\u8282\u70b9\u63d2\u5165\u8868\u5c3e\uff0c\u68c0\u67e5\u8282\u70b9\u6570\u91cf\u51b3\u5b9a\u662f\u5426\u8f6c\u7ea2\u9ed1\u6811\n        else {\n            for (int binCount = 0; ; ++binCount) {\n                \/\/ \u5faa\u73af\u627e\u5230\u94fe\u8868\u672b\u5c3e\uff0c\u63d2\u5165\u65b0\u8282\u70b9\n                if ((e = p.next) == null) {\n                    p.next = newNode(hash, key, value, null);\n                    \/\/ \u7531\u4e8e\u94fe\u8868\u63d2\u5165\u8282\u70b9\u8fbe\u5230\u9608\u503c\uff0c\u51b3\u5b9a\u6269\u5bb9\u6216\u8005\u8f6c\u7ea2\u9ed1\u6811\n                    if (binCount >= TREEIFY_THRESHOLD - 1)\n                        treeifyBin(tab, hash);\n                    break;\n                }\n                \/\/ \u82e5\u94fe\u8868\u5df2\u5b58\u5728\u8282\u70b9\u5219\u8bb0\u5f55\u8be5\u8282\u70b9\u4f9b\u540e\u7eed\u66f4\u65b0\u65b0\u503c\n                if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))\n                    break;\n                p = e;\n            }\n        }\n        \/\/ \u5df2\u5b58\u5728\u7684\u8282\u70b9\u66f4\u65b0\u65b0\u503c\uff0c\u8fd4\u56de\u65e7\u503c\n        if (e != null) {\n            V oldValue = e.value;\n            if (!onlyIfAbsent || oldValue == null)\n                e.value = value;\n            \/\/ \u4f9blinkedHashMap\u5b50\u7c7b\u8986\u5199\uff0c\u672c\u7ed3\u6784\u5185\u4e3a\u7a7a\u65b9\u6cd5\u4f53\n            afterNodeAccess(e);\n            return oldValue;\n        }\n    }\n\n    \/\/ \u672c\u6b21\u82e5\u63d2\u5165\u65b0\u8282\u70b9\u5219\u9700\u66f4\u65b0\u8282\u70b9\u6570\u91cf\uff0c\u5e76\u5224\u65ad\u662f\u5426\u8d85\u8fc7\u9608\u503c\u5f15\u8d77\u6269\u5bb9\n    ++modCount;\n    if (++size > threshold)\n        resize();\n    \/\/ \u4f9blinkedHashMap\u5b50\u7c7b\u8986\u5199\uff0c\u672c\u7ed3\u6784\u5185\u4e3a\u7a7a\u65b9\u6cd5\u4f53\n    afterNodeInsertion(evict);\n    \/\/ \u63d2\u5165\u65b0\u8282\u70b9\u4e00\u5f8b\u8fd4\u56denull\n    return null;\n}\n<\/pre>\n<p>resize()<\/p>\n<pre lang=\"java\">\nfinal HashMap.Node<K,V>[] resize() {\n    HashMap.Node<K,V>[] oldTab = table;\n    int oldCap = (oldTab == null) ? 0 : oldTab.length;\n    int oldThr = threshold;\n    int newCap, newThr = 0;\n\n    \/\/ \u5df2\u6709\u6570\u636e\u7684\u54c8\u5e0c\u8868\u6269\u5bb9\n    if (oldCap > 0) {\n        \/\/ \u8fbe\u5230\u9ed8\u8ba4\u6700\u5927\u5bb9\u91cf\u4e0d\u518d\u6269\u5bb9\uff0c\u5c06\u6269\u5bb9\u9608\u503c\u8bbe\u4e3aInteger.MAX_VALUE\n        if (oldCap >= MAXIMUM_CAPACITY) {\n            threshold = Integer.MAX_VALUE;\n            return oldTab;\n        }\n        \/\/ \u5927\u4e8e\u9ed8\u8ba4\u521d\u59cb\u5bb9\u91cf\u4e14\u672a\u8fbe\u9ed8\u8ba4\u6700\u5927\u5bb9\u91cf\u4e24\u500d\u6269\u5bb9\n        else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &#038;&#038; oldCap >= DEFAULT_INITIAL_CAPACITY)\n            \/\/ \u9608\u503c\u76f8\u5e94\u6269\u5927\u4e24\u500d\n            newThr = oldThr << 1;\n    }\n\n    \/\/ \u65e0\u6570\u636e\u7684\u54c8\u5e0c\u8868\u6269\u5bb9\uff08\u6709\u53c2\u6784\u9020\u9996\u6b21\u8c03\u7528put\uff09\u6307\u5b9a\u5bb9\u91cf\u4e3a\u6269\u5bb9\u9608\u503c\n    else if (oldThr > 0)\n        newCap = oldThr;\n    \/\/ \u65e0\u6570\u636e\u7684\u54c8\u5e0c\u8868\u6269\u5bb9\uff08\u65e0\u53c2\u6784\u9020\u9996\u6b21\u8c03\u7528put\uff09\u8bbe\u5b9a\u9ed8\u8ba4\u5bb9\u91cf16\uff0c\u9ed8\u8ba4\u6269\u5bb9\u9608\u503c12\n    else {\n        newCap = DEFAULT_INITIAL_CAPACITY;\n        newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);\n    }\n\n    \/\/ \u5df2\u8fbe\u6700\u5927\u5bb9\u91cf\u9650\u5236\u8bbe\u7f6e\u9608\u503cInteger.MAX_VALUE\uff0c\u6709\u53c2\u6784\u9020\u9996\u6b21\u8c03\u7528\u65f6\u8ba1\u7b97\u6269\u5bb9\u540e\u9608\u503c\n    if (newThr == 0) {\n        float ft = (float)newCap * loadFactor;\n        newThr = (newCap < MAXIMUM_CAPACITY &#038;&#038; ft < (float)MAXIMUM_CAPACITY ?\n                (int)ft : Integer.MAX_VALUE);\n    }\n\n    \/\/ \u66f4\u65b0\u9608\u503c\u4e3a\u6269\u5bb9\u540e\u7684\u65b0\u9608\u503c\n    threshold = newThr;\n    \/\/ \u4e3a\u6269\u5bb9\u540e\u7684\u54c8\u5e0c\u8868\u5206\u914d\u5185\u5b58\n    @SuppressWarnings({\"rawtypes\",\"unchecked\"})\n    HashMap.Node<K,V>[] newTab = (HashMap.Node<K,V>[])new HashMap.Node[newCap];\n    table = newTab;\n    \/\/ \u6267\u884crehash\n    if (oldTab != null) {\n        for (int j = 0; j < oldCap; ++j) {\n            HashMap.Node<K,V> e;\n            \/\/ \u65e7\u8282\u70b9\u7f6e\u7a7a\uff0c\u53ef\u88abGC\u56de\u6536\n            if ((e = oldTab[j]) != null) {\n                oldTab[j] = null;\n                \/\/ \u5355\u8282\u70b9\u91cd\u65b0hash\u81f3\u6269\u5bb9\u540e\u7684\u65b0\u4f4d\u7f6e\n                if (e.next == null)\n                    newTab[e.hash & (newCap - 1)] = e;\n                \/\/ \u7ea2\u9ed1\u6811\u8282\u70b9\u62c6\u5206\u91cd\u65b0hash\u81f3\u6269\u5bb9\u540e\u7684\u65b0\u4f4d\u7f6e\n                else if (e instanceof HashMap.TreeNode)\n                    ((HashMap.TreeNode<K,V>)e).split(this, newTab, j, oldCap);\n                \/\/ \u94fe\u8868\u8282\u70b9\u5feb\u901f\u91cd\u65b0hash\u81f3\u6269\u5bb9\u540e\u7684\u65b0\u4f4d\u7f6e\n                else {\n                    HashMap.Node<K,V> loHead = null, loTail = null;\n                    HashMap.Node<K,V> hiHead = null, hiTail = null;\n                    HashMap.Node<K,V> next;\n                    do {\n                        next = e.next;\n                        if ((e.hash & oldCap) == 0) {\n                            \/\/ \u91cd\u65b0\u7ec4\u6210lo\u94fe\u8868\n                            if (loTail == null)\n                                loHead = e;\n                            else\n                                loTail.next = e;\n                            loTail = e;\n                        }\n                        else {\n                            \/\/ \u91cd\u65b0\u7ec4\u6210hi\u94fe\u8868\n                            if (hiTail == null)\n                                hiHead = e;\n                            else\n                                hiTail.next = e;\n                            hiTail = e;\n                        }\n                    } while ((e = next) != null);\n                    \/\/ hash[j]\u69fd\u4e2d\u653elo\u94fe\u8868\n                    if (loTail != null) {\n                        loTail.next = null;\n                        newTab[j] = loHead;\n                    }\n                    \/\/ hash[j + oldCap]\u69fd\u4e2d\u653ehi\u94fe\u8868\n                    if (hiTail != null) {\n                        hiTail.next = null;\n                        newTab[j + oldCap] = hiHead;\n                    }\n                }\n            }\n        }\n    }\n    return newTab;\n}\n<\/pre>\n<p>\u4ee5\u4e0b\u8bf4\u660e\u6269\u5bb9\u540e\u5feb\u901f\u8ba1\u7b97\u6563\u5217\u4f4d\u7f6e\u7684\u539f\u7406<br \/>\n$\\scriptsize {}<br \/>\n\u6269\u5bb9\u524d\u540e\u5bb9\u91cf&#92;<br \/>\noldCap = capacity&#92;<br \/>\nnewCap = 2 * capacity&#92;<br \/>\n\u6269\u5bb9\u524d\u6563\u5217\u81f3\u540c\u4e00\u4f4d\u7f6e\u7684hash\u53ef\u80fd\u5305\u542b\u5947\u6570\u4e2a\u6216\u5076\u6570\u4e2acapacity&#92;<br \/>\noddHash= (2n+1) * capacity + i&#92;<br \/>\nevenHash= (2n) * capacity + i&#92;<br \/>\noddHash \\mod oldCap = i&#92;<br \/>\nevenHash \\mod oldCap = i&#92;<br \/>\n\u6269\u5bb9\u540e\u5305\u542b\u5947\u6570\u4e2acapacity\u7684hash\u6563\u5217\u81f3\u65b0\u4f4d\u7f6e\uff0c\u5076\u6570\u4e2acapacity\u7684\u6563\u5217\u503c\u4e0d\u53d8&#92;<br \/>\noddHash \\mod newCap = i + capacity = i + oldCap&#92;<br \/>\nevenHash \\mod newCap = i&#92;<br \/>\n\u6240\u4ee5\u5224\u5b9a\u5947\u5076\u5373\u53ef\u5224\u5b9a\u4f4d\u7f6e\uff0c\u5224\u5b9a\u65b9\u6cd5\u5982\u4e0b&#92;<br \/>\n&#91;(2n+1) * capacity + i&#93;_2\u4e2d\uff0ccapacity\u5bf9\u5e94\u4f4d\u5fc5\u4e3a1&#92;<br \/>\n&#91;(2n) * capacity&#93;_2\uff0ccapacity\u5bf9\u5e94\u4f4d\u5fc5\u4e3a0<br \/>\n$<br \/>\n<img decoding=\"async\" src=\"https:\/\/i0.wp.com\/tihar-tech.cn\/wp-content\/uploads\/2022\/10\/resize-hash.png?w=525\" alt=\"rehash-location\" data-recalc-dims=\"1\" \/><\/p>\n<p>putTreeVal<\/p>\n<pre lang=\"java\">\n\n<\/pre>\n<p>treeifyBin<\/p>\n<pre lang=\"java\">\n\n<\/pre>\n<p>split<\/p>\n<pre lang=\"java\">\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u7f6e\u77e5\u8bc6\u70b9 Hash\u6563\u5217\u8868\u539f\u7406 RBT\u7ea2\u9ed1\u6811\u539f\u7406 \u6e90\u7801\u9010\u884c\u89e3\u6790 \u4f18\u5316\u6280\u5de7\u603b\u7ed3 1\u3001\u6574\u6570\u4e58\u6cd5\u4f7f\u7528\u79fb\u4f4d\u8fd0\u7b97\u4ee3\u66ff\u4e58\u6cd5 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/139.196.114.170\/?p=2375\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cHashMap\u6e90\u7801\u5206\u6790\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[25],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/posts\/2375"}],"collection":[{"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/139.196.114.170\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2375"}],"version-history":[{"count":14,"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/posts\/2375\/revisions"}],"predecessor-version":[{"id":2475,"href":"http:\/\/139.196.114.170\/index.php?rest_route=\/wp\/v2\/posts\/2375\/revisions\/2475"}],"wp:attachment":[{"href":"http:\/\/139.196.114.170\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/139.196.114.170\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2375"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/139.196.114.170\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}