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

淺談Java的WeakHashMap源碼

 更新時間:2023年09月07日 11:15:50   作者:QZero_0  
這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會被GC自動刪除,即使程序員沒有調(diào)用remove()或者clear()方法,需要的朋友可以參考下

WeakHashMap源碼解析

JDK版本

JDK 1.8.0_110

總體介紹

介紹一個特殊的成員: WeakHashMap,從名字可以看出它是某種 Map。

它的特殊之處在于 WeakHashMap 里的 entry 可能會被GC自動刪除,即使程序員沒有調(diào)用 remove() 或者 clear() 方法。

更直觀的說,當(dāng)使用 WeakHashMap 時,即使沒有顯示的添加或刪除任何元素,也可能發(fā)生如下情況:

  • 調(diào)用兩次size()方法返回不同的值;
  • 兩次調(diào)用isEmpty()方法,第一次返回false,第二次返回true;
  • 兩次調(diào)用containsKey()方法,第一次返回true,第二次返回false,盡管兩次使用的是同一個key;
  • 兩次調(diào)用get()方法,第一次返回一個value,第二次返回null,盡管兩次使用的是同一個對象。

遇到這么奇葩的現(xiàn)象,是不是覺得使用者一定會瘋掉?

其實不然,WeakHashMap的這個特點特別適用于需要緩存的場景。

在緩存場景下,由于內(nèi)存是有限的,不能緩存所有對象;對象緩存命中可以提高系統(tǒng)效率,但緩存MISS也不會造成錯誤,因為可以通過計算重新得到。

要明白 WeakHashMap 的工作原理,還需要引入一個概念 : 弱引用(WeakReference)。

我們都知道Java中內(nèi)存是通過GC自動管理的,GC會在程序運行過程中自動判斷哪些對象是可以被回收的,并在合適的時機進行內(nèi)存釋放。

GC判斷某個對象是否可被回收的依據(jù)是,是否有有效的引用指向該對象。如果沒有有效引用指向該對象(基本意味著不存在訪問該對象的方式),那么該對象就是可回收的。這里的有效引用 并不包括弱引用。

也就是說,雖然弱引用可以用來訪問對象,但進行垃圾回收時弱引用并不會被考慮在內(nèi),僅有弱引用指向的對象仍然會被GC回收。

WeakHashMap 內(nèi)部是通過弱引用來管理 entry 的,弱引用的特性對應(yīng)到 WeakHashMap 上意味著什么呢?

將一對 key, value 放入到WeakHashMap里并不能避免該 key 值被GC回收,除非在 WeakHashMap之外還有對該 key 的強引用。

Java中引用也是分種類的,并且不同種類的引用對GC的影響不同就夠了。

具體實現(xiàn)

WeakHashMap的存儲結(jié)構(gòu)類似于Map

Weak HashSet

Java Collections工具類給出了解決方案, Collections.newSetFromMap(Map<E,Boolean> map) 方法可以將任何 Map包裝成一個Set。

通過如下方式可以快速得到一個 Weak HashSet:

// 將WeakHashMap包裝成一個Set
Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

不出所料, newSetFromMap() 方法只是對傳入的 Map做了簡單包裝:

// Collections.newSetFromMap()用于將任何Map包裝成一個Set
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
    return new SetFromMap<>(map);
}
private static class SetFromMap<E> extends AbstractSet<E>
    implements Set<E>, Serializable
{
    private final Map<E, Boolean> m;  // The backing map
    private transient Set<E> s;       // Its keySet
    SetFromMap(Map<E, Boolean> map) {
        if (!map.isEmpty())
            throw new IllegalArgumentException("Map is non-empty");
        m = map;
        s = map.keySet();
    }
    public void clear()               {        m.clear(); }
    public int size()                 { return m.size(); }
    public boolean isEmpty()          { return m.isEmpty(); }
    public boolean contains(Object o) { return m.containsKey(o); }
    public boolean remove(Object o)   { return m.remove(o) != null; }
    public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
    public Iterator<E> iterator()     { return s.iterator(); }
    public Object[] toArray()         { return s.toArray(); }
    public <T> T[] toArray(T[] a)     { return s.toArray(a); }
    public String toString()          { return s.toString(); }
    public int hashCode()             { return s.hashCode(); }
    public boolean equals(Object o)   { return o == this || s.equals(o); }
    public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
    public boolean removeAll(Collection<?> c)   {return s.removeAll(c);}
    public boolean retainAll(Collection<?> c)   {return s.retainAll(c);}
    // addAll is the only inherited implementation
    ......
}

到此這篇關(guān)于淺談Java的WeakHashMap源碼的文章就介紹到這了,更多相關(guān)WeakHashMap源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java、php、C#、asp實現(xiàn)短信群發(fā)功能的方法

    java、php、C#、asp實現(xiàn)短信群發(fā)功能的方法

    這篇文章主要介紹了java、php、C#、asp實現(xiàn)短信群發(fā)功能的方法,以實例形式較為詳細(xì)的分析了java及php、C#、asp、VB.NET等調(diào)用短信發(fā)送接口進行短信發(fā)送的功能,需要的朋友可以參考下
    2015-02-02
  • 解決Jenkins集成SonarQube遇到的報錯問題

    解決Jenkins集成SonarQube遇到的報錯問題

    本文給大家分享Jenkins集成SonarQube遇到的報錯問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Feign調(diào)用服務(wù)各種坑的處理方案

    Feign調(diào)用服務(wù)各種坑的處理方案

    這篇文章主要介紹了Feign調(diào)用服務(wù)各種坑的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring在代碼中獲取bean的幾種方式詳解

    Spring在代碼中獲取bean的幾種方式詳解

    這篇文章主要介紹了Spring在代碼中獲取bean的幾種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 教你怎么用Java通過關(guān)鍵字修改pdf

    教你怎么用Java通過關(guān)鍵字修改pdf

    此方法只適合通過關(guān)鍵字位置,在pdf上添加字符直接上代碼,代碼比較長,大部分自己的理解都在代碼注釋中了,需要的朋友可以參考下
    2021-05-05
  • Java中\(zhòng)n和\r區(qū)別

    Java中\(zhòng)n和\r區(qū)別

    本文主要介紹了Java中\(zhòng)n和\r區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • web容器中實例化spring相關(guān)配置解析

    web容器中實例化spring相關(guān)配置解析

    這篇文章主要介紹了web容器中實例化spring相關(guān)配置解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot頂層接口實現(xiàn)類注入項目的方法示例

    SpringBoot頂層接口實現(xiàn)類注入項目的方法示例

    本文主要介紹了SpringBoot頂層接口實現(xiàn)類注入項目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 一文詳解為什么越來越多項目開始從JDK?8升級到JDK?21

    一文詳解為什么越來越多項目開始從JDK?8升級到JDK?21

    從JDK 8升級到JDK 21,不僅是版本的迭代,更是開發(fā)理念與技術(shù)棧的全面革新,這篇文章主要介紹了為什么越來越多項目開始從JDK?8升級到JDK?21的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • 淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul

    淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul

    這篇文章主要介紹了淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

惠安县| 应城市| 顺平县| 武夷山市| 武安市| 依安县| 洛川县| 古浪县| 长宁县| 读书| 南木林县| 尉犁县| 岑巩县| 榆中县| 永川市| 根河市| 青浦区| 兴安盟| 阳山县| 应城市| 从化市| 沿河| 德清县| 尼勒克县| 鄂尔多斯市| 青田县| 西林县| 萍乡市| 班玛县| 新余市| 当雄县| 桂林市| 乌兰浩特市| 洛南县| 曲沃县| 青海省| 昭通市| 岳西县| 丹阳市| 湘乡市| 安阳市|