JAVA的引用类型

2019-11-01  本文已影响0人  今天也要努力呀y

分四种:
强引用
软引用
弱引用
虚引用

package Android;

import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

//Java的引用类型
//强引用:
//用等号建立起来,左边存在栈里,右边存在堆里
//软引用 SoftReference
public class Test {
    public static void main(String[] args) {
        //强应用
//        String str = "abc";//常量池
        //在堆内存中创建了String对象,在常量池中创建了abc对象

        String str = new String("abc");
        //创建一个软引用,引用str
        SoftReference<String> srf = new SoftReference<>(str);
        //创建一个弱引用,引用到str
        WeakReference<String> wrf = new WeakReference<>(str);
        //虚引用,不讲
        //PhantomReference

        //对象的可及性
        //对于abc来说,又最强的来决定,所以现在是强引用
        //强可及,永远不会被gc回收
        //软可及,内存不足时,会被gc回收
        //弱可及,gc发现就会回收

        str = null;//把强引用断开
        String sfrs = srf.get();
        String wfrs = wrf.get();

        System.out.println(sfrs);
        System.out.println(wfrs);
        //把软引用干掉
        srf.clear();
        sfrs = srf.get();
        wfrs = wrf.get();
        System.out.println(sfrs);
        System.out.println(wfrs);

        wfrs = null;
        System.gc();//垃圾回收器启动,回收堆内存
        sfrs = srf.get();
        wfrs = wrf.get();
        System.out.println(sfrs);
        System.out.println(wfrs);
    }
}

运行结果:
abc
abc
null
abc
null
null

如果不加这句(似乎是加了才会成为弱引用对象,这点有点不懂)
wfrs = null;
运行结果:
abc
abc
null
abc
null
abc

上一篇下一篇

猜你喜欢

热点阅读