日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

什么是WeakHashMap--转

發(fā)布時(shí)間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是WeakHashMap--转 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://laravel.iteye.com/blog/2303244

Java?WeakHashMap?到底Weak在哪里,它真的很弱嗎?WeakHashMap?的適用場(chǎng)景是什么,使用時(shí)需要注意些什么?弱引用和強(qiáng)引用對(duì)Java GC有什么不同影響?本文將給出清晰而簡(jiǎn)潔的介紹。

總體介紹

在Java集合框架系列文章的最后,筆者打算介紹一個(gè)特殊的成員:WeakHashMap,從名字可以看出它是某種?Map。它的特殊之處在于?WeakHashMap?里的entry可能會(huì)被GC自動(dòng)刪除,即使程序員沒(méi)有調(diào)用remove()或者clear()方法。

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

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

遇到這么奇葩的現(xiàn)象,你是不是覺(jué)得使用者一定會(huì)瘋掉?其實(shí)不然,WeekHashMap?的這個(gè)特點(diǎn)特別適用于需要緩存的場(chǎng)景。在緩存場(chǎng)景下,由于內(nèi)存是有限的,不能緩存所有對(duì)象;對(duì)象緩存命中可以提高系統(tǒng)效率,但緩存MISS也不會(huì)造成錯(cuò)誤,因?yàn)榭梢酝ㄟ^(guò)計(jì)算重新得到。

要明白?WeekHashMap?的工作原理,還需要引入一個(gè)概念:弱引用(WeakReference)。我們都知道Java中內(nèi)存是通過(guò)GC自動(dòng)管理的,GC會(huì)在程序運(yùn)行過(guò)程中自動(dòng)判斷哪些對(duì)象是可以被回收的,并在合適的時(shí)機(jī)進(jìn)行內(nèi)存釋放。GC判斷某個(gè)對(duì)象是否可被回收的依據(jù)是,是否有有效的引用指向該對(duì)象。如果沒(méi)有有效引用指向該對(duì)象(基本意味著不存在訪問(wèn)該對(duì)象的方式),那么該對(duì)象就是可回收的。這里的“有效引用”并不包括弱引用。也就是說(shuō),雖然弱引用可以用來(lái)訪問(wèn)對(duì)象,但進(jìn)行垃圾回收時(shí)弱引用并不會(huì)被考慮在內(nèi),僅有弱引用指向的對(duì)象仍然會(huì)被GC回收

WeakHashMap?內(nèi)部是通過(guò)弱引用來(lái)管理entry的,弱引用的特性對(duì)應(yīng)到?WeakHashMap?上意味著什么呢?將一對(duì)key, value放入到?WeakHashMap?里并不能避免該key值被GC回收,除非在?WeakHashMap?之外還有對(duì)該key的強(qiáng)引用

關(guān)于強(qiáng)引用,弱引用等概念以后再具體講解,這里只需要知道Java中引用也是分種類的,并且不同種類的引用對(duì)GC的影響不同就夠了。

具體實(shí)現(xiàn)

WeakHashMap的存儲(chǔ)結(jié)構(gòu)類似于HashMap,讀者可自行參考前文,這里不再贅述。

關(guān)于強(qiáng)弱引用的管理方式,博主將會(huì)另開(kāi)專題單獨(dú)講解。

Weak HashSet?

如果你看過(guò)前幾篇關(guān)于?Map?和?Set?的講解,一定會(huì)問(wèn):既然有?WeekHashMap,是否有?WeekHashSet?呢?答案是沒(méi)有:( 。不過(guò)Java?Collections工具類給出了解決方案,Collections.newSetFromMap(Map<E,Boolean> map)方法可以將任何?Map包裝成一個(gè)Set。通過(guò)如下方式可以快速得到一個(gè)?Weak HashSet:

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

不出你所料,newSetFromMap()方法只是對(duì)傳入的?Map做了簡(jiǎn)單包裝:

//?Collections.newSetFromMap()用于將任何Map包裝成一個(gè)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
????
}

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/5564023.html

總結(jié)

以上是生活随笔為你收集整理的什么是WeakHashMap--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。