<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 19px; line-height: 25px; ">在以下代码References类中,依次创建了10个软引用、10个弱引用和10个虚引用,它们各自引用一个Grocery对象。从程序运 行时的打印结果可以看出,虚引用形同虚设,它所引用的对象随时可能被垃圾回收,具有弱引用的对象拥有稍微长的生命周期,当垃圾回收器执行回收操作时,有可能被垃圾回收,具有软引用的对象拥有较长的生命周期,但在Java虚拟机认为内存不足的情况下,也会被垃圾回收。</span>
[html] view plaincopyprint?
package test;
import java.lang.ref.*;
import java.util.*;
class Grocery {
private static final int SIZE = 10000;
// 属性d使得每个Grocery对象占用较多内存,有80K左右
private double[] d = new double[SIZE];
private String id;
public Grocery(String id) {
this.id = id;
}
public String toString() {
return id;
}
public void finalize() {
System.out.println("Finalizing " + id);
}
}
public class References {
private static ReferenceQueue rq = new ReferenceQueue();
public static void checkQueue() {
Reference inq = rq.poll();
// 从队列中取出一个引用
if (inq != null)
System.out.println("In queue: " + inq + " : " + inq.get());
}
public static void main(String[] args) {
final int size = 10;
// 创建10个Grocery对象以及10个软引用
Set sa = new HashSet();
for (int i = 0; i < size; i++) {
SoftReference ref = new SoftReference(new Grocery("soft" + i), rq);
System.out.println("Just created soft: " + ref.get());
sa.add(ref);
}
System.gc();
checkQueue();
System.out.println("---------------------------------------------------");
// 创建10个Grocery对象以及10个弱引用
Set wa = new HashSet();
for (int i = 0; i < size; i++) {
WeakReference ref = new WeakReference(new Grocery ("weak " + i), rq);
System.out.println("Just created weak: " + ref.get());
wa.add(ref);
}
System.gc();
checkQueue();
System.out.println("---------------------------------------------------");
// 创建10个Grocery对象以及10个虚引用
Set pa = new HashSet();
for (int i = 0; i < size; i++) {
PhantomReference ref =new PhantomReference(new Grocery("Phantom " + i), rq);
System.out.println("Just created Phantom: " + ref.get());
pa.add(ref);
}
System.gc();
checkQueue();
}
}
在Java集合中有一种特殊的Map类型:WeakHashMap, 在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收,那么相应的值对象的引用会从Map中删除。WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。
MyObject aRef=new MyObject();
SoftReference aSoftRef=new SoftReference(aRef);
看到另一个有用的知识点:
set --其中的值不允许重复,无序的数据结构
list --其中的值允许重复,因为其为有序的数据结构
map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换)
ArrayList , Vector , LinkedList 是 List 的实现类
ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的
LinkedList 是线程不安全的,底层是由链表实现的
Map 是键值对集合
HashTable 和 HashMap 是 Map 的实现类
HashTable 是线程安全的,不能存储 null 值
HashMap 不是线程安全的,可以存储 null 值