今天看別人寫的代碼, 其中使用了兩種Map子類, IdentityHashMap和WeakHashMap, 經(jīng)查看JDK文檔得知:
IdentityHashMap
此類利用哈希表實(shí)現(xiàn) Map 接口,比較鍵(和值)時(shí)使用引用相等性代替對(duì)象相等性。換句話說(shuō),在 IdentityHashMap 中,當(dāng)且僅當(dāng) (k1==k2) 時(shí),才認(rèn)為兩個(gè)鍵 k1 和 k2 相等(在正常 Map 實(shí)現(xiàn)(如 HashMap)中,當(dāng)且僅當(dāng)滿足下列條件時(shí)才認(rèn)為兩個(gè)鍵 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。
也就是說(shuō), 如果Key是同一個(gè)對(duì)象才算是鍵相等, 如果只是值相等, 那么不算相等.
比如
Map<Pet, String> map = new IdentityHashMap<Pet, String>();
Pet p = new Pet("eric");
map.put(new Pet("eric"), "eric");
map.put(new Pet("eric"), "hello");
System.out.println("size = " + map.size());
Map<Pet, String> hashMap = new HashMap<Pet, String>();
hashMap.put(new Pet("eric"), "eric");
hashMap.put(new Pet("eric"), "hello");
System.out.println("hashMap size = " + hashMap.size());
Pet中的equals中只要name相等, 就算這兩個(gè)pet對(duì)象相等. 執(zhí)行結(jié)果為:
size = 2
hashMap size = 1
WeakHashMap
以弱鍵 實(shí)現(xiàn)的基于哈希表的 Map。在 WeakHashMap 中,當(dāng)某個(gè)鍵不再正常使用時(shí),將自動(dòng)移除其條目。更精確地說(shuō),對(duì)于一個(gè)給定的鍵,其映射的存在并不阻止垃圾回收器對(duì)該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。丟棄某個(gè)鍵時(shí),其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實(shí)現(xiàn)有所不同。
其實(shí)就是除了本map引用以外, 沒有其他對(duì)象引用該key對(duì)象, 則WeakHashMap會(huì)自動(dòng)移除這個(gè)key以及對(duì)應(yīng)的值.