欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java WeakHashMap案例詳解

 更新時(shí)間:2021年08月19日 08:26:43   作者:Jennire_Q  
這篇文章主要介紹了Java WeakHashMap案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

WeakHashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map接口。
和HashMap一樣,WeakHashMap 也是一個(gè)散列表,它存儲的內(nèi)容也是鍵值對(key-value)映射,而且鍵和值都可以是null
不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中,當(dāng)某個(gè)鍵不再正常使用時(shí),會被從WeakHashMap中被自動移除。更精確地說,對于一個(gè)給定的鍵,其映射的存在并不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。某個(gè)鍵被終止時(shí),它對應(yīng)的鍵值對也就從映射中有效地移除了。
這個(gè)“弱鍵”的原理呢?大致上就是,通過WeakReference和ReferenceQueue實(shí)現(xiàn)的。 WeakHashMap的key是“弱鍵”,即是WeakReference類型的;ReferenceQueue是一個(gè)隊(duì)列,它會保存被GC回收的“弱鍵”。實(shí)現(xiàn)步驟是:

  1. 新建WeakHashMap,將“鍵值對”添加到WeakHashMap中。實(shí)際上,WeakHashMap是通過數(shù)組table保存Entry(鍵值對);每一個(gè)Entry實(shí)際上是一個(gè)單向鏈表,即Entry是鍵值對鏈表。
  2. 當(dāng)某“弱鍵”不再被其它對象引用,并被GC回收時(shí)。在GC回收該“弱鍵”時(shí),這個(gè)“弱鍵”也同時(shí)會被添加到ReferenceQueue(queue)隊(duì)列中。
  3. (03) 當(dāng)下一次我們需要操作WeakHashMap時(shí),會先同步table和queue。table中保存了全部的鍵值對,而queue中保存被GC回收的鍵值對;同步它們,就是刪除table中被GC回收的鍵值對。這就是“弱鍵”如何被自動從WeakHashMap中刪除的步驟了。

和HashMap一樣,WeakHashMap是不同步的??梢允褂?Collections.synchronizedMap 方法來構(gòu)造同步的 WeakHashMap

既然有WeakHashMap,那么有WeakHashSet嗎?  java collections包是沒有直接提供WeakHashSet的。

我們可以通過Collections.newSetFromMap(Map<E,Boolean> map)方法可以將任何 Map包裝成一個(gè)Set。源碼如下:

public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
        return new SetFromMap<>(map);
    }
 
    /**
     * @serial include
     */
    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);}

就是對傳入的map進(jìn)行了簡單的包裝

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

相關(guān)文章

  • Java中對null進(jìn)行強(qiáng)制類型轉(zhuǎn)換的方法

    Java中對null進(jìn)行強(qiáng)制類型轉(zhuǎn)換的方法

    小編對null進(jìn)行強(qiáng)轉(zhuǎn)會不會拋錯(cuò),非常的好奇,下面小編通過實(shí)例代碼給大家介紹Java中對null進(jìn)行強(qiáng)制類型轉(zhuǎn)換的方法,感興趣的朋友參考下吧
    2018-09-09
  • 深入理解 Java 中的 Switch 語句示例詳解

    深入理解 Java 中的 Switch 語句示例詳解

    在Java編程中,switch語句通過表達(dá)式值來執(zhí)行不同代碼塊,本文介紹switch語法、案例、注意事項(xiàng),以及與if語句的對比,包括基本語法、關(guān)鍵字、表達(dá)式、case常量、break和default的使用,以及如何根據(jù)輸入的字符輸出星期、大小寫轉(zhuǎn)換、成績判斷和季節(jié)判斷等實(shí)際應(yīng)用場景
    2024-10-10
  • JavaCV與FFmpeg音視頻流處理技巧總結(jié)大全

    JavaCV與FFmpeg音視頻流處理技巧總結(jié)大全

    JavaCV是一個(gè)開源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺庫(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV與FFmpeg音視頻流處理技巧總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • SpringBoot淺析安全管理之OAuth2框架

    SpringBoot淺析安全管理之OAuth2框架

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理OAuth2框架的使用
    2022-08-08
  • SpringBoot學(xué)習(xí)系列之MyBatis Plus整合封裝的實(shí)例詳解

    SpringBoot學(xué)習(xí)系列之MyBatis Plus整合封裝的實(shí)例詳解

    MyBatis-Plus是一款MyBatis的增強(qiáng)工具(簡稱MP),為簡化開發(fā)、提高效率,這篇文章給大家介紹MyBatis Plus整合封裝的實(shí)例詳解,感興趣的朋友跟隨小編一起看看吧
    2020-08-08
  • JDK源碼白話解讀之ThreadLocal篇

    JDK源碼白話解讀之ThreadLocal篇

    其實(shí)網(wǎng)上有很多關(guān)于ThreadLocal的文章了,有不少文章也已經(jīng)寫的非常好了。但是很多同學(xué)反應(yīng)還有一些部分沒有講解的十分清楚,還是有一定的疑惑沒有想的十分清楚
    2022-02-02
  • Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄

    Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能

    登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時(shí)見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。今天小編給大家分享基于Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能,感興趣的朋友一起看看吧
    2019-11-11
  • 解決一個(gè)JSON反序列化問題的辦法(空字符串變?yōu)榭占?

    解決一個(gè)JSON反序列化問題的辦法(空字符串變?yōu)榭占?

    在平時(shí)的業(yè)務(wù)開發(fā)中,經(jīng)常會有拿到一串序列化后的字符串要來反序列化,下面這篇文章主要給大家介紹了如何解決一個(gè)JSON反序列化問題的相關(guān)資料,空字符串變?yōu)榭占?需要的朋友可以參考下
    2024-03-03
  • mybatis 中 foreach collection的用法小結(jié)(三種)

    mybatis 中 foreach collection的用法小結(jié)(三種)

    這篇文章主要介紹了mybatis 中 foreach collection的用法小結(jié)(三種),需要的朋友可以參考下
    2017-10-10
  • Java看完秒懂版熔斷和降級的關(guān)系

    Java看完秒懂版熔斷和降級的關(guān)系

    這篇文章主要介紹了Java熔斷和降級的關(guān)系,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評論