HashSet是如何實現(xiàn)的?
HashSet是對HashMap的簡單包裝,對HashSet的函數(shù)調用都會轉換成合適的HashMap方法
//HashSet是對HashMap的簡單包裝public class HashSet{……private transient HashMap map;//HashSet里面有一個HashMap // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap(); } …… public boolean add(E e) {//簡單的方法轉換 return map.put(e, PRESENT)==null; } ……}
什么是WeakHashMap?
我們都知道Java中內存是通過GC自動管理的,GC會在程序運行過程中自動判斷哪些對象是可以被回收的,并在合適的時機進行內存釋放。GC判斷某個對象是否可被回收的依據(jù)是,是否有有效的引用指向該對象。如果沒有有效引用指向該對象(基本意味著不存在訪問該對象的方式),那么該對象就是可回收的。這里的有效引用 并不包括弱引用。也就是說,雖然弱引用可以用來訪問對象,但進行垃圾回收時弱引用并不會被考慮在內,僅有弱引用指向的對象仍然會被GC回收。
WeakHashMap 內部是通過弱引用來管理entry的,弱引用的特性對應到 WeakHashMap 上意味著什么呢?
WeakHashMap 里的entry可能會被GC自動刪除,即使程序員沒有調用remove()或者clear()方法。
WeakHashMap 的這個特點特別適用于需要緩存的場景。在緩存場景下,由于內存是有限的,不能緩存所有對象;對象緩存命中可以提高系統(tǒng)效率,但緩存MISS也不會造成錯誤,因為可以通過計算重新得到。
如若轉載,請注明出處:開源字節(jié) https://sourcebyte.cn/article/164.html