Android修炼之道—Java之强引用、软引用、弱引用、虚引用

<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


你可能感兴趣的:(Android修炼之道—Java之强引用、软引用、弱引用、虚引用)