最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解

 更新時間:2023年09月11日 12:00:56   作者:桉樹先生  
這篇文章主要介紹了Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解,HashMap的key保留了對實際對象的強引用,這意味著只要HashMap對象不被銷毀,還HashMap的所有key所引用的對象就不會被垃圾回收,需要的朋友可以參考下

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接口來訪問文件的方法

    下面小編就為大家分享一篇使用Java7的Files工具類和Path接口來訪問文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • java swing標準對話框具體實現(xiàn)

    java swing標準對話框具體實現(xiàn)

    這篇文章介紹了swing標準對話框的具體實現(xiàn)方法,有需要的朋友可以參考一下
    2013-06-06
  • Java中Runnable和Callable分別什么時候使用

    Java中Runnable和Callable分別什么時候使用

    提到 Java 就不得不說多線程了,就算你不想說,面試官也得讓你說呀,那說到線程,就不得不說Runnable和Callable這兩個家伙了,二者在什么時候使用呢,下面就來和簡單講講
    2023-08-08
  • springboot中的@value取不到正確的值問題

    springboot中的@value取不到正確的值問題

    這篇文章主要介紹了springboot中的@value取不到正確的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java中get()方法和set()方法的作用淺析

    java中get()方法和set()方法的作用淺析

    這篇文章主要給大家介紹了關于java中get()方法和set()方法的作用,set是是對數(shù)據(jù)進行設置,而get是對數(shù)據(jù)進行獲取,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Spring Boot集成Shiro并利用MongoDB做Session存儲的方法詳解

    Spring Boot集成Shiro并利用MongoDB做Session存儲的方法詳解

    這篇文章主要給大家介紹了關于Spring Boot集成Shiro并利用MongoDB做Session存儲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧。
    2017-12-12
  • Mybatis如何直接執(zhí)行SQL語句

    Mybatis如何直接執(zhí)行SQL語句

    這篇文章主要介紹了Mybatis如何直接執(zhí)行SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    這篇文章主要介紹了Slf4j+logback實現(xiàn)JSON格式日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java HashTable的原理與實現(xiàn)

    Java HashTable的原理與實現(xiàn)

    Java中的HashTable是一種線程安全的哈希表實現(xiàn),它可以高效地存儲和快速查找數(shù)據(jù),本文將介紹Java中的HashTable的實現(xiàn)原理、常用方法和測試用例,需要的小伙伴可以參考一下
    2023-09-09
  • Java 單元測試之Mockito 模擬靜態(tài)方法與私有方法最佳實踐

    Java 單元測試之Mockito 模擬靜態(tài)方法與私有方法最佳實踐

    本文將深入探討如何使用 Mockito 來模擬靜態(tài)方法和私有方法,結合大量實戰(zhàn)代碼示例,帶你突破傳統(tǒng)單元測試的邊界,寫出更徹底、更獨立、更具可讀性的測試用例,感興趣的朋友跟隨小編一起看看吧
    2025-09-09

最新評論

恩施市| 保靖县| 长泰县| 惠安县| 高唐县| 库伦旗| 福贡县| 武义县| 九龙县| 房产| 荥阳市| 海原县| 来安县| 云龙县| 塔城市| 纳雍县| 安康市| 尼玛县| 永登县| 临邑县| 冀州市| 来宾市| 鸡东县| 永安市| 西和县| 淮南市| 彭阳县| 长白| 莎车县| 铜梁县| 德保县| 冕宁县| 金川县| 滦南县| 留坝县| 文安县| 宁津县| 固阳县| 广南县| 荣成市| 梅州市|