java Map 一個key其實可以保存多個value

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


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


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類,這樣我們我們就可以需要的時候使用到這個類了。
我相信平時的多積累總會爲我們帶來好處的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章