在本教程中,我们将借助示例学习Java WeakHashMap及其操作。我们还将了解WeakHashMap和HashMap之间的区别
Java集合框架的WeakHashMap类提供了哈希表数据结构的功能。
它实现了Map接口。
注意:弱键hashmap属于WeakReference类型。
弱引用类型的对象可以在Java中被垃圾收集,如果该引用不再在程序中使用。
首先让我们学习创建一个弱哈希映射。然后,我们将了解它与hashmap的区别。
为了创建一个弱哈希表,我们必须首先导入该java.util.WeakHashMap包。导入程序包后,可以使用以下方法在Java中创建弱哈希表。
//创建WeakHashMap,容量为8,负载因子为0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);
在上面的代码中,我们创建了一个名为numbers的WeakHashMap。
这里,
Key - 用于关联映射中每个元素(值)的唯一标识符
Value - 映射中与键关联的元素
注意new WeakHashMap<>(8,0.6)这一部分。这里,第一个参数是capacity,第二个参数是loadFactor。
capacity - 该映射的容量为8。意味着,它可以存储8个条目。
loadFactor- 此映射的负载因子为0.6。这意味着只要我们的哈希表填充了60%,条目就会被移到新哈希表中,该哈希表的大小是原始哈希表的两倍。
默认容量和负载系数
可以在不定义其容量和负载因子的情况下创建WeakHashMap。例如,
//具有默认容量和负载因子的WeakHashMap WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();
默认,
map的容量将为 16
负载因子将为0.75
让我们看看Java中弱哈希表的实现。
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建名称为numbers的WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; //插入元素 numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); //null引用 two = null; //执行垃圾回收 System.gc(); System.out.println("Weak垃圾回收后的HashMap : " + numbers); } }
输出结果
WeakHashMap: {Four=4, Two=2} Weak垃圾回收后的HashMap : {Four}
如我们所见,当two弱哈希图的键设置为null并执行垃圾回收时,该键将被删除。
这是因为与散列表不同,弱散列表的键属于弱引用类型。这意味着如果不再使用映射条目,则垃圾收集器将删除该条目。这对于节省资源很有用。
现在让我们在哈希图中查看相同的实现。
import java.util.HashMap; class Main { public static void main(String[] args) { //创建偶数HashMap HashMap<String, Integer> numbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; //插入元素 numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); //使引用为空 two = null; //执行垃圾回收 System.gc(); System.out.println("垃圾回收后的HashMap : " + numbers); } }
输出结果
HashMap: {Four=4, Two=2} 垃圾回收后的HashMap : {Four=4, Two=2}
在此,将哈希表的键two设置为null并执行垃圾回收时,不会删除该键。
这是因为与弱hashmap不同,hashmap的键具有强引用类型。这意味着即使映射条目的键不再被使用,该条目也不会被垃圾回收器删除。
注意:hashmap和弱hashmap的所有功能都是相似的,除了弱hashmap的键是弱引用,而hashmap的键是强引用。
这是我们可以从其他map创建弱哈希表的方法。
import java.util.HashMap; import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数的hashmap HashMap<String, Integer> evenNumbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // 从其他哈希映射创建弱哈希映射 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers); System.out.println("WeakHashMap: " + numbers); } }
输出结果
HashMap: {Two=2} WeakHashMap: {Two=2}
WeakHashMap类提供了允许我们对映射执行各种操作的方法。
put() - 将指定的键/值映射插入到映射中
putAll() - 将指定映射中的所有条目插入到此映射中
putIfAbsent() - 如果map中不存在指定的键,则将指定的键/值映射插入到map中
例如,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数WeakHashMap WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; // 使用 put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // 使用 putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("偶数的WeakHashMap: " + evenNumbers); //创建名为numbers的WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // 使用 putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap的数字: " + numbers); } }
输出结果
偶数的WeakHashMap: {Four=4, Two=2} WeakHashMap的数字: {Two=2, Four=4, One=1}
1.使用entrySet(),keySet()和values()
entrySet() - 返回一组所有键/值映射的集合
keySet() - 返回map所有键的集合
values() - 返回map所有值的集合
例如,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // 使用 entrySet() System.out.println("Key/Value 映射: " + numbers.entrySet()); // 使用 keySet() System.out.println("Keys: " + numbers.keySet()); // 使用 values() System.out.println("Values: " + numbers.values()); } }
输出结果
WeakHashMap: {Two=2, One=1} Key/Value 映射: [Two=2, One=1] Keys: [Two, One] Values: [1, 2]
2.使用get()和getOrDefault()
get()- 返回与指定键关联的值。如果找不到键,则返回null。
getOrDefault() - 返回与指定键关联的值。如果找不到键,则返回指定的默认值。
例如,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // 使用 get() int value1 = numbers.get("Two"); System.out.println("使用 get() 方法: " + value1); // 使用 getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("使用 getOrDefault() 方法: " + value2); } }
输出结果
WeakHashMap: {Two=2, One=1} 使用 get() 方法: 2 使用 getOrDefault() 方法: 4
remove(key) - 返回并从映射中删除与指定键相关联的项。
remove(key, value) - 仅当指定键映射到指定值并返回布尔值时,才从映射中删除条目
例如,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // 使用 remove()并带1个参数 int value = numbers.remove("Two"); System.out.println("删除值: " + value); // 使用 remove()并带2个参数 boolean result = numbers.remove("One", 3); System.out.println("条目 {One=3} 已被删除? " + result); System.out.println("更新后的WeakHashMap: " + numbers); } }
输出结果
WeakHashMap: {Two=2, One=1} 删除值: 2 条目 {One=3} 已被删除? False 更新后的WeakHashMap: {One=1}
方法 | 描述 |
---|---|
clear() | 从map中删除所有条目 |
containsKey() | 检查map是否包含指定的键并返回布尔值 |
containsValue() | 检查map是否包含指定的值并返回布尔值 |
size() | 返回map的大小 |
isEmpty() | 检查map是否为空并返回布尔值 |