問題引入
初學java的時候,Map集合給人留下的印象就是鍵值對{key=value}的存儲方式。并且我們知道鍵值對的key唯一。但是Map容器真的不能存儲key值相同的數據嗎?查詢API才發現有這么一個實現類可以存儲重復的key:IdentityHashMap。
IdentityHashMap簡介
IdentityHashMap類同樣實現了Map接口,擁有Map集合的一切特性。key值同樣需要判斷是不是重復,根本就是判斷的方法和其他Map的實現類不一樣。
我們來看看官方的定義: java.util.IdentityHashMap類利用哈希表實現 Map 接口,比較鍵(和值)時使用引用相等性代替對象相等性。 換句話說,在 IdentityHashMap 中,當且僅當 (k1==k2) 時,才認為兩個鍵 k1 和 k2 相等(在正常 Map 實現(如 HashMap)中,當且僅當滿足下列條件時才認為兩個鍵 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。
也就是說,IdentityHashMap比較的單單key的值,它不管可以的內存地址還是基本數據類型。而正常的Map實現比較的是具體的內容。
簡單的小Demo
public class IdentityHashMapDemo { public static void main(String[] args) { //測試key可以重復的map集合 HashMap<Object, String> map = new HashMap<>(); IdentityHashMap<Object, String> idenMap = new IdentityHashMap<>(); idenMap.put("測試", "成功"); idenMap.put("測試", "失敗"); map.put("測試", "成功"); map.put("測試", "失敗"); System.out.結果分析可以看出: 如果存放的是非對象,IdentityHashMap和其他Map的實現沒有區別。區別在與可一直存放的對象。使用兩次new String() 創建的對象的內存地址必然不會相同,但是指向的內容是相同的。所以HashMap會認為是同一個key從而覆蓋前一個key對應的值。但是IdentityHashMap只會去比較key實際的值,也就是內存地址而不會管他具體的內容。所以認為不是同一個key。
Q&AString str = new String("abc")//這句代碼到底創建了幾個對象?String str = "abc" //該代碼和上述代碼有什么區別?/* 第一段代碼實際創建了兩個對象。第二段代碼創建了一個對象。("abc")就相當于第二段代碼。 這時已經創建了一次對象。再遇到new關鍵字時,創建第二個對象這個對象保存的是"abc"的內存地址, 并沒有真正的指向字符串"abc"。 String str = "abc"是字符串比較特別的創建對象的方式。創建之后會作為常量保存在方法區的常量池中。 它創建對象的時候,會先在常量池中查詢有沒有已經的存在的字符串常量,如果有就會把其對應的地址給它,如果沒有才會創建。*/新聞熱點
疑難解答