Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java WeakHashMap

在本教程中,我們將借助示例學(xué)習(xí)Java WeakHashMap及其操作。我們還將了解WeakHashMap和HashMap之間的區(qū)別

Java集合框架的WeakHashMap類提供了哈希表數(shù)據(jù)結(jié)構(gòu)的功能。

它實(shí)現(xiàn)了Map接口。

Java WeakHashMap實(shí)現(xiàn)了Map接口。

注意:弱鍵hashmap屬于WeakReference類型。

弱引用類型的對(duì)象可以在Java中被垃圾收集,如果該引用不再在程序中使用。

首先讓我們學(xué)習(xí)創(chuàng)建一個(gè)弱哈希映射。然后,我們將了解它與hashmap的區(qū)別。

創(chuàng)建一個(gè)WeakHashMap

為了創(chuàng)建一個(gè)弱哈希表,我們必須首先導(dǎo)入該java.util.WeakHashMap包。導(dǎo)入程序包后,可以使用以下方法在Java中創(chuàng)建弱哈希表。

//創(chuàng)建WeakHashMap,容量為8,負(fù)載因子為0.6
WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

在上面的代碼中,我們創(chuàng)建了一個(gè)名為numbers的WeakHashMap。

這里,

  • Key - 用于關(guān)聯(lián)映射中每個(gè)元素(值)的唯一標(biāo)識(shí)符

  • Value - 映射中與鍵關(guān)聯(lián)的元素

注意new WeakHashMap<>(8,0.6)這一部分。這里,第一個(gè)參數(shù)是capacity,第二個(gè)參數(shù)是loadFactor。

  • capacity - 該映射的容量為8。意味著,它可以存儲(chǔ)8個(gè)條目。

  • loadFactor- 此映射的負(fù)載因子為0.6。這意味著只要我們的哈希表填充了60%,條目就會(huì)被移到新哈希表中,該哈希表的大小是原始哈希表的兩倍。

默認(rèn)容量和負(fù)載系數(shù)

可以在不定義其容量和負(fù)載因子的情況下創(chuàng)建WeakHashMap。例如,

//具有默認(rèn)容量和負(fù)載因子的WeakHashMap
WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();

默認(rèn),

  • map的容量將為 16

  • 負(fù)載因子將為0.75

HashMap和WeakHashMap之間的區(qū)別

讓我們看看Java中弱哈希表的實(shí)現(xiàn)。

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建名稱為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;

        //執(zhí)行垃圾回收
        System.gc();

        System.out.println("Weak垃圾回收后的HashMap : " + numbers);
    }
}

輸出結(jié)果

WeakHashMap: {Four=4, Two=2}
Weak垃圾回收后的HashMap : {Four}

如我們所見,當(dāng)two弱哈希圖的鍵設(shè)置為null并執(zhí)行垃圾回收時(shí),該鍵將被刪除。

這是因?yàn)榕c散列表不同,弱散列表的鍵屬于弱引用類型。這意味著如果不再使用映射條目,則垃圾收集器將刪除該條目。這對(duì)于節(jié)省資源很有用。

現(xiàn)在讓我們?cè)诠D中查看相同的實(shí)現(xiàn)。

import java.util.HashMap;

class Main {
    public static void main(String[] args) {
        //創(chuàng)建偶數(shù)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;

        //執(zhí)行垃圾回收
        System.gc();

        System.out.println("垃圾回收后的HashMap : " + numbers);
    }
}

輸出結(jié)果

HashMap: {Four=4, Two=2}
垃圾回收后的HashMap : {Four=4, Two=2}

在此,將哈希表的鍵two設(shè)置為null并執(zhí)行垃圾回收時(shí),不會(huì)刪除該鍵。

這是因?yàn)榕c弱hashmap不同,hashmap的鍵具有強(qiáng)引用類型。這意味著即使映射條目的鍵不再被使用,該條目也不會(huì)被垃圾回收器刪除。

注意:hashmap和弱hashmap的所有功能都是相似的,除了弱hashmap的鍵是弱引用,而hashmap的鍵是強(qiáng)引用。

從其他映射創(chuàng)建WeakHashMap

這是我們可以從其他map創(chuàng)建弱哈希表的方法。

import java.util.HashMap;
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建偶數(shù)的hashmap 
        HashMap<String, Integer> evenNumbers = new HashMap<>();

        String two = new String("Two");
        Integer twoValue = 2;
        evenNumbers.put(two, twoValue);
        System.out.println("HashMap: " + evenNumbers);

        // 從其他哈希映射創(chuàng)建弱哈希映射 
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers);

        System.out.println("WeakHashMap: " + numbers);
    }
}

輸出結(jié)果

HashMap: {Two=2}
WeakHashMap: {Two=2}

WeakHashMap的方法

WeakHashMap類提供了允許我們對(duì)映射執(zhí)行各種操作的方法。

將元素插入WeakHashMap

  • put() - 將指定的鍵/值映射插入到映射中

  • putAll() - 將指定映射中的所有條目插入到此映射中

  • putIfAbsent() - 如果map中不存在指定的鍵,則將指定的鍵/值映射插入到map中

例如,

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建偶數(shù)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("偶數(shù)的WeakHashMap: " + evenNumbers);

        //創(chuàng)建名為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的數(shù)字: " + numbers);
    }
}

輸出結(jié)果

偶數(shù)的WeakHashMap: {Four=4, Two=2}
WeakHashMap的數(shù)字: {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) {
        // 創(chuàng)建偶數(shù)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());
    }
}

輸出結(jié)果

WeakHashMap: {Two=2, One=1}
Key/Value 映射: [Two=2, One=1]
Keys: [Two, One]
Values: [1, 2]

2.使用get()和getOrDefault()

  • get()- 返回與指定鍵關(guān)聯(lián)的值。如果找不到鍵,則返回null。

  • getOrDefault() - 返回與指定鍵關(guān)聯(lián)的值。如果找不到鍵,則返回指定的默認(rèn)值。

例如,

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建偶數(shù)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);

    }
}

輸出結(jié)果

WeakHashMap: {Two=2, One=1}
使用 get() 方法: 2
使用 getOrDefault() 方法: 4

刪除WeakHashMap元素

  • remove(key) - 返回并從映射中刪除與指定鍵相關(guān)聯(lián)的項(xiàng)。

  • remove(key, value) - 僅當(dāng)指定鍵映射到指定值并返回布爾值時(shí),才從映射中刪除條目

例如,

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建偶數(shù)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個(gè)參數(shù)
        int value = numbers.remove("Two");
        System.out.println("刪除值: " + value);

        // 使用 remove()并帶2個(gè)參數(shù)
        boolean result = numbers.remove("One", 3);
        System.out.println("條目 {One=3} 已被刪除? " + result);

        System.out.println("更新后的WeakHashMap: " + numbers);
    }
}

輸出結(jié)果

WeakHashMap: {Two=2, One=1}
刪除值: 2
條目 {One=3} 已被刪除? False
更新后的WeakHashMap: {One=1}

WeakHashMap的其他方法

方法描述
clear()從map中刪除所有條目
containsKey()檢查map是否包含指定的鍵并返回布爾值
containsValue()檢查map是否包含指定的值并返回布爾值
size()返回map的大小
isEmpty()檢查map是否為空并返回布爾值
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清