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 其他主题

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是否为空并返回布尔值