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