java Map 一個key其實可以儲存多個value
我們平時使用的Map,都是隻能在Map中儲存一個相同的Key,我們後面儲存的相同的key都會將原來的key的值覆蓋掉,如下面的例子。
<pre class="java" name="code">package test62; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class test { /** * @param args * @author 王新 */ public static void main(String[] args) { String str1 = new String("xx"); String str2 = new String("xx"); System.out.println(str1 == str2); Map<String ,String> map = new HashMap<String,String>(); map.put(str1, "hello"); map.put(str2, "world"); for(Entry<String,String> entry :map.entrySet()) { System.out.println(entry.getKey()+" " + entry.getValue()); } System.out.println("---->" + map.get("xx")); } }
這個例子中我們可以看見相同的key只能儲存一個value值,下面我們來看一種map可以實現一個key中儲存多個value。這個map也就是IdentityHashMap。下面我們就來介紹下IdentityHashMap這個類的使用。
API上這樣來解釋這個類的:此類不是 通用 Map 實現!此類實現 Map 介面時,它有意違反 Map 的常規協定,該協定在比較物件時強制使用 equals 方法。此類設計僅用於其中需要引用相等性語義的罕見情況。
IdentityHashMap類利用雜湊表實現 Map 介面,比較鍵(和值)時使用引用相等性代替物件相等性。我們來看看這個類的程式碼吧:
package test62; import java.util.IdentityHashMap; import java.util.Map; import java.util.Map.Entry; public class test1 { public static void main(String[] args) { String str1 = "xx"; String str2 = "xx"; System.out.println(str1 == str2); Map<String ,String> map = new IdentityHashMap<String ,String>(); map.put(str1, "hello"); map.put(str2, "world"); for(Entry<String,String> entry : map.entrySet()) { System.out.println(entry.getKey()+" " + entry.getValue()); } System.out.println("containsKey---> " + map.containsKey("xx")); System.out.println("value----> " + map.get("xx")); } }
這端程式碼輸出的結果如下:
true xx world containsKey—> true value----> world
為什麼我們的Key還是隻儲存了一個值????這個問題和《java解惑第62題一樣》書上面是這樣解釋的,我們來看看:
語言規範保證了字串是記憶體限定的,換句話說,相等的字串常量同時也是相同的[JLS 15.28]。這可以確保在我們的程式中第二次出現的字串字面常量“xx”引用到了與第一次相同的String例項上,因此儘管我們使用了一個IdentityHashMap來代替諸如HashMap這樣的通用目的的Map實現,但是對程式的行為卻不會產生任何影響。
我們來看看下面的程式碼就可以實現一個key儲存兩個value的情況。我們的程式碼如下:
<pre class="java" name="code">package test62;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class test1 {
public static void main(String[] args) {
String str1 = new String("xx");
String str2 = new String("xx");
System.out.println(str1 == str2);
Map<String ,String> map = new IdentityHashMap<String ,String>();
map.put(str1, "hello");
map.put(str2, "world");
for(Entry<String,String> entry : map.entrySet())
{
System.out.println(entry.getKey()+" " + entry.getValue());
}
System.out.println(" containsKey---> " + map.containsKey("xx"));
System.out.println("str1 containsKey---> " + map.containsKey(str1));
System.out.println("str2 containsKey---> " + map.containsKey(str2));
System.out.println(" value----> " + map.get("xx"));
System.out.println("str1 value----> " + map.get(str1));
System.out.println("str2 value----> " + map.get(str2));
}
}
我們的看看輸出的結果為: false xx world xx hello containsKey—> false str1 containsKey—> true str2 containsKey—> true value----> null str1 value----> hello str2 value----> world
我們可以知道IdentityHashMap是靠物件來判斷key是否相等的,如果我們一個key需要儲存多個value的時候就需要使用到這個IdentityHashMap類,這樣我們我們就可以需要的時候使用到這個類了。