java Map 一個key其實可以保存多個value – JAVA編程語言程序開發技術文章

我們平時使用的Map,都是隻能在Map中保存一個相同的Key,我們後面保存的相同的key都會將原來的key的值覆蓋掉,如下面的例子。

[java] 
<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 接口,比較鍵(和值)時使用引用相等性代替對象相等性。我們來看看這個類的代碼吧:

[java] 
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的情況。我們的代碼如下:

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

作者:wx_962464

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。