<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 值