Java中的HashMap与WeakHashMap
HashMap
Java.util.HashMap类是一种基于哈希函数的实现。在HashMap中,我们有一个键和一个值。
即使对象被指定为哈希表中的键,它也没有任何引用,并且如果与HashMap相关联,它将无法进行垃圾回收 (即HashMap优先于垃圾收集器)。
// Java程序举例
// Hashmap
import java.util.*;
class HashMapDemo
{
public static void main(String args[])throws Exception
{
HashMap m = new HashMap();
Demo d = new Demo();
// 将对象放入HashMap中
m.put(d," Hi ");
System.out.println(m);
d = null;
// 垃圾收集器被调用
System.gc();
//线程休眠4s
Thread.sleep(4000);
System.out.println(m);
}
}
class Demo
{
public String toString()
{
return "demo";
}
// finalize方法
public void finalize()
{
System.out.println("finalize 方法被调用");
}
}
输出结果:
{demo=Hi}
{demo=Hi}
WeakHashMap
WeakHashMap同样是Map接口的一种实现。与HashMap几乎相同,只是在WeakHashMap中,如果将对象指定为键并且不包含任何引用,则它可以进行垃圾收集,即垃圾收集器优先于WeakHashMap。 (即使它与WeakHashMap相关联)。
// Java程序举例
// WeakHashmap
import java.util.*;
class WeakHashMapDemo
{
public static void main(String args[])throws Exception
{
WeakHashMap m = new WeakHashMap();
Demo d = new Demo();
// 将对象放入WeakHashMap中
m.put(d," Hi ");
System.out.println(m);
d = null;
// 垃圾收集器被调用
System.gc();
// 线程休眠4s
Thread.sleep(4000); .
System.out.println(m);
}
}
class Demo
{
public String toString()
{
return "demo";
}
// finalize方法
public void finalize()
{
System.out.println("finalize 方法被调用");
}
}
输出结果:
{demo = Hi}
finalize 方法被调用
{ }
Hashmap与Weakhashmap的一些重要区别:
- 强引用 strong reference vs 弱引用 Weak References : 弱引用对象不是引用对象的默认类型/类,而是在使用时应明确指定。在WeakHashMap中,使用弱引用类型引用条目对象。
强引用: 是引用对象的默认类型/类。任何具有活动强引用的对象都不会进行垃圾收集。在HashMap中,键对象具有强引用。 - 垃圾回收机制 Garbage Collector: 在HashMap中,条目对象(条目对象存储键值对)不符合垃圾回收机制的条件,即HashMap优先于垃圾回收机制。
在WeakHashmap中,当某个键被丢弃时,与该键相关联的条目将自动从映射中删除,换言之,进行垃圾回收。 - 克隆方法 Clone method 的实现 Implementation: HashMap实现了Cloneable接口。
WeakHashMap没有实现Cloneable接口,它只实现了Map接口。因此,WeakHashMap类中没有clone()方法。