Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解
WeakHashMap
WeakHashMap與HashMap的用法基本類似。
區(qū)別:
- HashMap的key保留了對實際對象的強引用,這意味著只要HashMap對象不被銷毀,還HashMap的所有key所引用的對象就不會被垃圾回收,HashMap也不會自動刪除這些key所對應的key-value對;
- WeakHashMap的key只保留對實際對象的弱引用,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被垃圾回收,WeakHashMap也可能自動刪除這些key所對應的key-value對。
- WeakHashMap中的每個key對象只持有對實際對象的弱引用,因此,當垃圾回收了該key所對應的實際對象之后,WeakHashMap會自動刪除該key對應的key-value對。
注意:
如果需要使用WeakHashMap的key來保留對象的弱引用,則不要讓該key所引用的對象具有任何強引用,否則將失去WeakHashMap的意義。
示例:
package com.map;
import java.util.WeakHashMap;
public class WeakHashMapTest {
public static void main(String[] args) {
WeakHashMap wak = new WeakHashMap();
//兩個key都是匿名字符串對象(沒有其他引用)
wak.put(new String("數(shù)學"), new String("優(yōu)良"));
wak.put(new String("語文"), new String("良好"));
//該key是一個系統(tǒng)緩存的字符串對象
wak.put("java", new String("好"));①
System.out.println(wak);
//{java=良好, 數(shù)學=優(yōu)良, 語文=良好}
//通知系統(tǒng)進行垃圾回收
System.gc();
System.runFinalization();
System.out.println(wak);//{java=好}
}
}結果上來看:當系統(tǒng)進行垃圾時,刪除了WeakHashMap 對象的前兩個key-value對,因為添加前兩個key-value對時,這兩個key都是匿名的字符串對象,WeakHashMap 只保留了對它們的弱引用,這樣垃圾回收時會自動刪除這兩個key-value對。
WeakHashMap對象中①標示處的key是一個字符串直接量(系統(tǒng)會自動保留對該字符串對象的強引用),所以垃圾回收時不會回收它。
IdentityHashMap
在IdentityHashMap中,當且僅當兩個key嚴格相等(key1==key2)時,IdentityHashMap才認為兩個key相等;相對于普通HashMap而言,只要key1和key2通過equals()方法返回true,且它們的hashCode值相等即可。
注意:
IdentityHashMap是一個特殊的Map實現(xiàn)!此類實現(xiàn)Map接口時,它有意違反Map的通常規(guī)范:IdentityHashMap要求兩個key嚴格相等才認為兩個key相等。IdentityHashMap不保證key-value對之間的順序,更不能保證它們的順序隨時間的推移保持不變。
示例:
package com.map;
import java.util.IdentityHashMap;
public class IdentityHashMapTest {
public static void main(String[] args) {
IdentityHashMap idenmap = new IdentityHashMap();
idenmap.put(new String("語文"), 80);
idenmap.put(new String("語文"), 89);
idenmap.put("java", 80);
idenmap.put("java", 80);
System.out.println(idenmap);
//{語文=80, java=80, 語文=89}
}
}IdentityHashMap對象中添加了4個key-value對,前2個key-value對中的key是最新創(chuàng)建的字符串對象,它們通過==比較不相等,所以IdentityHashMap 會把他們當成2個key來處理;后2個key-value都是字符串直接量,而且它們的字符序列完全相同,Java使用常量池來管理字符串直接量,所以它們通過==比較返回true,IdentityHashMap 會認為它們是同一個key,因此只有一次可以添加成功。
EnumMap
EnumMap是一個與枚舉類一起使用的Map實現(xiàn),EnumMap中的所有key都必須是單個枚舉類的枚舉值。創(chuàng)建EnumMap時必須顯示或隱式的指定它對應的枚舉類。
EnumMap特征:
- EnumMap在內(nèi)部以數(shù)組形式保存,所以這種實現(xiàn)形式非常緊湊、高效。
- EunmMap根據(jù)key的自然順序(即枚舉值在枚舉類中的定義順序)來維護key-value對的順序。
- EnumMap不允許使用null作為key,但允許使用null作為value。如果試圖使用null作為key時將拋出NullpointerException。
如果只是查詢是否包含值為null的key,或只是刪除值為null的key,都不會拋出異常。
與普通的Map有所區(qū)別的是,創(chuàng)建EnumMap是必須指定一個枚舉類,從而將該EnumMap和指定枚舉類關聯(lián)起來。
示例:
package com.map;
import java.util.EnumMap;
public class EnumMapTest {
public static void main(String[] args) {
EnumMap map = new EnumMap(Season.class);
map.put(Season.SPRING, "春天");
map.put(Season.SUMMER, "夏天");
System.out.println(map);
//{SPRING=春天, SUMMER=夏天}
}
}
enum Season{
SPRING,SUMMER,FAIL,WINTER
}到此這篇關于Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解的文章就介紹到這了,更多相關Java的WeakHashMap和EnumMap、IdentityHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Java7的Files工具類和Path接口來訪問文件的方法
下面小編就為大家分享一篇使用Java7的Files工具類和Path接口來訪問文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Java中Runnable和Callable分別什么時候使用
提到 Java 就不得不說多線程了,就算你不想說,面試官也得讓你說呀,那說到線程,就不得不說Runnable和Callable這兩個家伙了,二者在什么時候使用呢,下面就來和簡單講講2023-08-08
Spring Boot集成Shiro并利用MongoDB做Session存儲的方法詳解
這篇文章主要給大家介紹了關于Spring Boot集成Shiro并利用MongoDB做Session存儲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧。2017-12-12
Slf4j+logback實現(xiàn)JSON格式日志輸出方式
這篇文章主要介紹了Slf4j+logback實現(xiàn)JSON格式日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java 單元測試之Mockito 模擬靜態(tài)方法與私有方法最佳實踐
本文將深入探討如何使用 Mockito 來模擬靜態(tài)方法和私有方法,結合大量實戰(zhàn)代碼示例,帶你突破傳統(tǒng)單元測試的邊界,寫出更徹底、更獨立、更具可讀性的測試用例,感興趣的朋友跟隨小編一起看看吧2025-09-09

