编辑这个页面须要登录或更高权限!

Java WeakHashMap

在本教程中,我们将借助示例学习Java WeakHashMap及其操作。我们还将了解WeakHashMap和HashMap之间的区别

Java集合框架的WeakHashMap类提供了哈希表数据结构的功能。

它实现了Map接口

Java WeakHashMap实现了Map接口。

注意:弱键hashmap属于WeakReference类型。

弱引用类型的对象可以在Java中被垃圾收集,如果该引用不再在程序中使用。

首先让我们学习创建一个弱哈希映射。然后,我们将了解它与hashmap的区别。

创建一个WeakHashMap

为了创建一个弱哈希表,我们必须首先导入该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

HashMap和WeakHashMap之间的区别

让我们看看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的键是强引用。

从其他映射创建WeakHashMap

这是我们可以从其他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的方法

WeakHashMap类提供了允许我们对映射执行各种操作的方法。

将元素插入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}

访问WeakHashMap元素

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

删除WeakHashMap元素

  • 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}

WeakHashMap的其他方法

方法描述
clear()从map中删除所有条目
containsKey()检查map是否包含指定的键并返回布尔值
containsValue()检查map是否包含指定的值并返回布尔值
size()返回map的大小
isEmpty()检查map是否为空并返回布尔值

Java 菜鸟教程
Java 流程控制
Java 数组
Java 面向对象(I)
Java 面向对象(II)
Java 面向对象(III)
Java 异常处理
Java 列表(List)
Java Queue(队列)
Java Map集合
Java Set集合
Java 输入输出(I/O)
Java Reader/Writer
Java 其他主题