位置:首頁 > Java技術 > Java教學 > Java WeakHashMap類

Java WeakHashMap類

WeakHashMap中是存儲隻是其鍵的弱引用的Map接口實現。僅存儲弱引用允許一個鍵值對進行垃圾回收時,它的鍵不再是WeakHashMap的外部引用。

這個類提供了利用弱引用的力量最簡單的方法。這是實施“注冊表樣”的數據結構,其中一個項目的效用消失時,它的鍵不再是可達的任何線程有用。

在WeakHashMap中的功能相同,有一個很重要的例外HashMap中:如果Java的內存管理器不再具有很強的參考指定作為重點對象,在映射中的條目將被刪除。

弱引用:如果一個對象的唯一引用是弱引用,垃圾回收器可以在任何時候回收對象占用的內存。它不必等到係統耗儘內存。通常情況下,它會被垃圾回收器下次運行時釋放。

在WeakHashMap中類支持四個構造函數。第一種形式構造一個新的空WeakHashMap用默認的初始容量(16)和默認加載因子(0.75):

WeakHashMap() 

第二種形式構造具有給定的初始容量和默認加載因子(0.75)的新的空WeakHashMap:

WeakHashMap(int initialCapacity)

第三種形式構造一個新的空WeakHashMap用給定的初始容量和指定加載因子。

WeakHashMap(int initialCapacity, float loadFactor) 

第四種形式構造一個新WeakHashMap用相同的映射關係與指定的Map:

WeakHashMap(Map t) 

除了從它的父類繼承的方法,TreeMap中定義了以下方法:

SN 方法及描述
1 void clear() 
移除所有映射關係從這個映射中。
2 boolean containsKey(Object key) 
返回true如果此映射包含指定鍵的映射關係。
3 boolean containsValue(Object value) 
返回true如果此映射一個或多個鍵映射到指定值。
4 Set entrySet()
返回此映射中包含的映射關係的collection視圖。
5 Object get(Object key) 
返回指定鍵映射在此弱哈希映射,或者null,如果映射不包含此鍵的值。
6 boolean isEmpty()
返回true如果此映射不包含鍵 - 值映射關係。
7 Set keySet()
Returns a set view of the keys contained in this map.
8 Object put(Object key, Object value) 
關聯與此映射中的指定鍵指定的值。
9 void putAll(Map m) 
複製所有由指定映射的映射到此映射,這些映射關係將替換此映射的所有當前指定映射中鍵的所有映射關係。
10 Object remove(Object key) 
從此映射中移除(如果存在)映射為這個鍵。
11 int size() 
返回鍵 - 值映射關係在這映射的數量。
12 Collection values()
返回此映射中包含的值的collection視圖。

例子:

下麵的程序說明了幾個由這個集合所支持的方法:

import java.util.*;

public class WeakHashMap {
   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Maine"), "Augusta");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Maine")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Thread waiting");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Main waiting");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

這將產生以下結果:

Main waiting
Thread waiting

如果不包括調用System.gc(),係統可能永遠不會運行垃圾收集器冇有多大的內存所使用的程序。對於一個更積極的方案,調用是不必要的。