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

Java中的WeakHashMap簡析

 更新時間:2023年09月06日 09:16:10   作者:JFS_Study  
這篇文章主要介紹了Java中的WeakHashMap簡析,Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直譯就是,虛弱的 HashMap,從名字可得知其和 HashMap 有關,需要的朋友可以參考下

一、什么是 WeakHashMap

Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。

WeakHashMap,直譯就是:虛弱的 HashMap。

從名字可得知其和 HashMap 有關,確實如此,WeakHashMap 功能幾乎和 HashMap 一致。

Weak,聯(lián)想java.lang.ref包下的弱引用(WeakReference),由此這里面還牽扯到了一種弱引用結構。

二、HashMap 和 WeakHashMap 的區(qū)別

先看下 WeakHashMap 和 HashMap 中單個對象的組成:

WeakHashMap.Entry 和 HashMap.Node 的不同點在于,WeakHashMap.Entry 繼承了WeakReference。

弱引用的生存期特別短。垃圾回收的時候,一旦發(fā)現(xiàn)弱引用對象,無論當前內(nèi)存空間是否充足,都會將弱引用回收。

想象一下如下場景:

  1. 調(diào)用兩次 size():第一次為 10,第二次就為 8 了。
  2. 兩次調(diào)用 isEmpty():第一次返回 false,第二次返回 true。
  3. 兩次調(diào)用 containsKey():第一次返回 true,第二次返回 false。
  4. 兩次調(diào)用 get():第一次返回一個 value,第二次返回 null。

三、使用場景

在如今的并發(fā)泛濫的大環(huán)境下,大家應該都用過緩存,緩存都是放在內(nèi)存中的,而內(nèi)存幾乎是計算機中最寶貴也是最稀缺的資源,所以需要謹慎的使用,不然很容易就出現(xiàn) OOM。

緩存的主要作用是為了更快的處理業(yè)務、降低服務器的壓力,那么就要保證緩存命中率,這里假設整個緩存是一個 key-value 結構的(以鍵值對緩存為例),HashMap 作為強引用對象在沒有主動將 key 刪除時是不會被 JVM 回收的,這樣 HashMap 中的對象就會越積越多直到 OOM 錯誤;

那么如何做到既讓緩存的命中率高又不占用那么多的內(nèi)存,這里就可以采用 WeakHashMap,當然不會有 HashMap 100% 的命中率(假設內(nèi)存足夠),但是在保證程序正常的前提下更好的實現(xiàn)了緩存這套解決方案。

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

將一對 key-value 放入到 WeakHashMap 里并不能避免該 key 值被 GC 回收(除非在 WeakHashMap 之外還有對該 key 的強引用),故內(nèi)存問題也可以解決。

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

相關文章

  • Java中的concurrenthashmap集合詳細剖析

    Java中的concurrenthashmap集合詳細剖析

    這篇文章主要介紹了Java中的concurrenthashmap集合詳細剖析,有參構造后第一次put時會進行初始化,由源碼可知,會先判斷所傳入的容量是否>=最大容量的一半,如果滿足條件,就會將容量修改為最大值,反之則會將容量改為所傳入數(shù)*1.5+1,需要的朋友可以參考下
    2023-11-11
  • 關于break和continue以及l(fā)abel的區(qū)別和作用(詳解)

    關于break和continue以及l(fā)abel的區(qū)別和作用(詳解)

    下面小編就為大家?guī)硪黄P于break和continue以及l(fā)abel的區(qū)別和作用(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Spring MVC是Spring框架中的一個模塊,用于開發(fā)基于MVC(Model-View-Controller)架構的Web應用程序,它提供了一種輕量級的、靈活的方式來構建Web應用,同時提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下
    2024-05-05
  • Java如何將任意類型的Object對象轉(zhuǎn)換為相應的實體對象

    Java如何將任意類型的Object對象轉(zhuǎn)換為相應的實體對象

    這篇文章主要介紹了Java如何將任意類型的Object對象轉(zhuǎn)換為相應的實體對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作

    Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作

    這篇文章主要介紹了Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • idea快捷鍵生成getter和setter,有構造參數(shù),無構造參數(shù),重寫toString方式

    idea快捷鍵生成getter和setter,有構造參數(shù),無構造參數(shù),重寫toString方式

    這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構造參數(shù),無構造參數(shù),重寫toString方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 基于Java制作一個燈謎猜猜樂游戲

    基于Java制作一個燈謎猜猜樂游戲

    中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一,全國各地為了增強過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動,比如猜燈謎,所以本文就來用Java制作一個燈謎猜猜樂游戲,感興趣的可以了解下
    2023-09-09
  • java中對Redis的緩存進行操作的示例代碼

    java中對Redis的緩存進行操作的示例代碼

    本篇文章主要介紹了java中對Redis的緩存進行操作的示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Java如何獲取Object中Value

    Java如何獲取Object中Value

    在Java中,獲取Object中的值需依賴于對象的類型和屬性,常用方法包括使用反射、getter方法、接口或抽象類、Map等數(shù)據(jù)結構,本文給大家介紹Java如何獲取Object中Value,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 項目為什么引入log4j而不是logback代碼

    項目為什么引入log4j而不是logback代碼

    這篇文章主要介紹了項目為什么引入log4j而不是logback代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論