📜  Java中的Hashmap与WeakHashMap

📅  最后修改于: 2022-05-13 01:54:52.214000             🧑  作者: Mango

Java中的Hashmap与WeakHashMap

哈希映射

Java.util.HashMap 类是一个基于散列的实现。在 HashMap 中,我们有一个键和一个值对。
即使该对象在 hashmap 中被指定为键,它也没有任何引用,并且如果它与 HashMap 相关联,即 HashMap 优于 Garbage Collector,则它符合垃圾收集的条件。

Java
// Java program to illustrate
// Hashmap
import java.util.*;
class HashMapDemo
{
    public static void main(String args[])throws Exception
    {
        HashMap m = new HashMap();
        Demo d = new Demo();
         
        // puts an entry into HashMap
        m.put(d," Hi ");
         
        System.out.println(m);
        d = null;
         
        // garbage collector is called
        System.gc();
         
        //thread sleeps for 4 sec
        Thread.sleep(4000);
         
        System.out.println(m);
        }
    }
    class Demo
    {
        public String toString()
        {
            return "demo";
        }
         
        // finalize method
        public void finalize()
        {
            System.out.println("Finalize method is called");
        }
}


Java
// Java program to illustrate
// WeakHashmap
import java.util.*;
class WeakHashMapDemo
{
    public static void main(String args[])throws Exception
    {
        WeakHashMap m = new WeakHashMap();
        Demo d = new Demo();
         
        // puts an entry into WeakHashMap
        m.put(d," Hi ");
        System.out.println(m);
         
        d = null;
         
        // garbage collector is called
        System.gc();
         
        // thread sleeps for 4 sec
        Thread.sleep(4000); .
         
        System.out.println(m);
    }
}
 
class Demo
{
    public String toString()
    {
        return "demo";
    }
     
    // finalize method
    public void finalize()
    {
        System.out.println("finalize method is called");
    }
}


输出:

{demo=Hi}
{demo=Hi}

弱哈希映射

WeakHashMap 是 Map 接口的一个实现。 WeakHashMap 与 HashMap 几乎相同,但在 WeakHashMap 的情况下,如果将对象指定为键不包含任何引用 - 即使它与 WeakHashMap 相关联,它也有资格进行垃圾收集。即垃圾收集器在 WeakHashMap 上占主导地位。

Java

// Java program to illustrate
// WeakHashmap
import java.util.*;
class WeakHashMapDemo
{
    public static void main(String args[])throws Exception
    {
        WeakHashMap m = new WeakHashMap();
        Demo d = new Demo();
         
        // puts an entry into WeakHashMap
        m.put(d," Hi ");
        System.out.println(m);
         
        d = null;
         
        // garbage collector is called
        System.gc();
         
        // thread sleeps for 4 sec
        Thread.sleep(4000); .
         
        System.out.println(m);
    }
}
 
class Demo
{
    public String toString()
    {
        return "demo";
    }
     
    // finalize method
    public void finalize()
    {
        System.out.println("finalize method is called");
    }
}

输出:

{demo = Hi}
finalize method is called
{ }

Hashmap 和 WeakHashmap 之间一些更重要的区别:

  1. 强引用与弱引用:弱引用对象不是引用对象的默认类型/类,在使用它们时应明确指定。这种类型的引用在 WeakHashMap 中用于引用入口对象。
    强引用:这是引用对象的默认类型/类。任何具有活动强引用的对象都没有资格进行垃圾回收。在 HashMap 中,关键对象具有强引用。
  2. Garbage Collector 的作用: Garbage Collected :在 HashMap 中,入口对象(入口对象存储键值对)不符合垃圾回收的条件,即 Hashmap 优于 Garbage Collector。
    在 WeakHashmap 中,当一个键被丢弃时,它的条目会自动从映射中删除,换句话说,就是垃圾回收。
  3. Clone方法实现: HashMap实现Cloneable接口。
    WeakHashMap 没有实现 Cloneable 接口,它只实现了 Map 接口。因此,WeakHashMap 类中没有 clone() 方法。