1. 程式人生 > >java Map 一個key其實可以儲存多個value

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類,這樣我們我們就可以需要的時候使用到這個類了。