作爲每IdentityHashMap
的Javadocs,它說IdentityHashMap是否會引起衝突?
此類實現
Map
接口利用哈希表,比較鍵 (和值)時使用 引用相等代替對象相等的。換句話說,在IdentityHashMap
中,當且僅當(k1==k2)
時,兩個密鑰k1和 k2被認爲是相等的。 (在正常Map
實現(像HashMap
)兩個鍵K1和K2被認爲是相等 當且僅當(k1==null ? k2==null : k1.equals(k2))
。)
據我所知,指向不同的存儲位置的兩個不同的對象仍可以具有相同的散列碼,因此object1.equals(object2)
可以返回true
。 但是,指向不同存儲位置的兩個不同對象永遠不會爲object1 == object2
返回true
。
問題1 - 當IdentityHashMap
嚴格依賴於參考平等,這是否意味着碰撞永遠不會發生?
問題2 - 調試下面的代碼顯示了我的6個桶,其中key和value都存儲在單獨的桶中。但HashMap
的情況並非如此,其中密鑰和值存儲在同一個存儲桶中。因爲它的名字中有一個'哈希'單詞,所以它必須是哈希鍵,那麼它爲什麼單獨存儲鍵和值,以及它如何檢索給定鍵的值?
String A = "abc";
String B = "def";
String C = new String("abc");
Map<String, String> map1 = new IdentityHashMap<String, String>();
map1.put(A, "123");
map1.put(B, "345");
map1.put(C, "567");
這裏有很多困惑的想法。 1.所有的哈希系統必須處理碰撞。 2.具有相同的哈希碼並不意味着equals()返回true。 3.在類名稱中存在「散列」與單獨存儲鍵和值無關,這是由於其名稱中存在「映射」這個詞而產生的。 – EJP