WeakHashMap类是Map接口的一个实现,它只存储对键的弱引用。仅存储弱引用允许在键不再在WeakHashMap之外引用时对键值对进行垃圾收集。
此类提供了利用弱引用功能的最简单方法。它对于实现“类似注册表”的数据结构很有用,其中当任何线程不再可以访问键时,项目的实用程序就会消失。
WeakHashMap的功能与HashMap相同,但有一个非常重要的特性:如果Java内存管理器不再具有对指定为键的对象的强引用,则将删除映射中的条目。
弱引用 - 如果对象的唯一引用是弱引用,则垃圾回收器可以随时回收对象的内存。它不必等到系统内存不足。通常,它将在下次垃圾收集器运行时释放。
以下是WeakHashMap类支持的构造函数列表。
编号
构造函数
描述
1
WeakHashMap()
此构造函数使用默认初始容量(16)和默认加载因子(0.75)构造一个新的空WeakHashMap。
2
WeakHashMap(int initialCapacity)
此构造函数使用给定的初始容量和默认加载因子(0.75)构造一个新的空WeakHashMap。
3
WeakHashMap(int initialCapacity, float loadFactor)
4
WeakHashMap(Map t)
此构造函数构造一个新的WeakHashMap,其映射与指定的Map相同。
除了从父类继承的方法之外,WeakHashMap还定义了以下方法 -
编号
方法
描述
1
void clear()
从此映射中删除所有映射。
2
boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回true。
3
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回true。
4
Set entrySet()
返回此映射中包含的映射的集合视图。
5
Object get(Object key)
返回指定键在此标识哈希映射中映射到的值,如果映射不包含此键的映射,则返回null。
6
boolean isEmpty()
如果此映射不包含键-值映射,则返回true。
7
Set keySet()
返回此映射中包含的键的set视图。
8
Object put(Object key, Object value)
将指定的值与此映射中的指定键相关联。
9
void putAll(Map m)
将指定映射中的所有映射复制到此映射。这些映射将替换此映射对当前位于指定映射中键的映射。
10
Object remove(Object key)
从此映射中删除此键的映射(如果存在)。
11
int size()
返回此映射中键-值映射的数量。
12
Collection values()
返回此映射中包含值的集合视图。
示例
以下程序演示了如何使用此集合支持的几种方法 -
import java.util.*;
public class WeakHashMapDemo {
private static Map map;
public static void main(String args[]) {
map = new WeakHashMap();
map.put(new String("Yiibai.com"), "Kaops.com");
Runnable runner = new Runnable() {
public void run() {
while (map.containsKey("Yiibai.com")) {
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()的调用,系统可能永远不会运行垃圾收集器,因为程序使用的内存不多。对于更活跃的程序,调用是不必要的。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。