English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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接口

注意:弱键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 클래스는 맵에 다양한 작업을 수행할 수 있는 메서드를 제공합니다。

Element를 WeakHashMap에 삽입

  • put() - 지정된 키를/값 매핑이 매핑에 삽입됨

  • putAll() - 지정된 매핑의 모든 항목을 이 매핑에 삽입

  • putIfAbsent() - map에 지정된 키가 없으면, 지정된 키를/값 매핑이 map에 삽입됨

예를 들어,

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // Even number 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) {
        // Even number 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) {
        // Even number 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) {
        // Even number 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이 비어 있는지 확인하고 부울 값을 반환