java的引用类型有哪几种(java的引用类型是什么)
导语:Java的引用类型
1.java的引用类型分为强引用,软引用,和弱引用以及虚引用.
创建强引用
String text=new String("123");
利用=号来创建强引用
创建软引用
SoftReference<String> sfr=new SoftReference<String>(text);
针对上面的对象创建了一个软引用,相当于对于同一个对象123,创建了两个引用,分别是强引用和软引用
创建弱引用
WeakReference<String> wrf=new WeakReference<String>(text);
同理,针对同一个变量创建三个引用,分别是强引用,软引用和弱引用
另外还有最后一个虚引用,这里省略
2.关于四种引用,不同情况还有一种特性叫作及物性
例如,不管对于一个变量,创建了多少种引用,只要存在强引用,那么这个变量就叫做强及物性,针对这种情况,垃圾回收器,也就是gc,是永远不会回收这种变量的.
假如,驱除了强引用,只剩下了软引用和弱引用,那么这时候这个变量就叫做软及物,针对这种情况,gc只有在内存不够的情况下,才会回收变量
最后,驱除了强引用和软引用,只剩下弱引用的时候,gc只要发现了这个变量,就会马上回收内存.
3.案例演示
①案例一:
//在堆里面创建一个对象,即是 new String(),同时也会在常量池里面创建一个常量,即是123; 并且String text指向的是堆里面的对象
String text=new String("123");
//创建软引用
SoftReference<String> sfr=new SoftReference<String>(text);
//创建弱引用
WeakReference<String> wrf=new WeakReference<String>(text);
//这时候,变量是属于强引用.
System.out.println(text);
②案例二:
//在堆里面创建一个对象,即是 new String(),同时也会在常量池里面创建一个常量,即是123; 并且String text指向的是堆里面的对象
String text=new String("123");
//创建软引用
SoftReference<String> sfr=new SoftReference<String>(text);
//创建弱引用
WeakReference<String> wrf=new WeakReference<String>(text);
//这时候,变量是属于强引用.
System.out.println(text);
//这时候驱除了强引用,也就是变量属于软引用,当内存不够的时候,gc才会回收
text=null;
//打印输出变量的取值
System.out.println(sfr.get());
System.out.println(wrf.get());
//这时候是可以输出123的效果的.
③案例三:
//在堆里面创建一个对象,即是 new String(),同时也会在常量池里面创建一个常量,即是123; 并且String text指向的是堆里面的对象
String text=new String("123");
//创建软引用
SoftReference<String> sfr=new SoftReference<String>(text);
//创建弱引用
WeakReference<String> wrf=new WeakReference<String>(text);
//这时候,变量是属于强引用.
System.out.println(text);
//这时候驱除了强引用,也就是变量属于软引用,当内存不够的时候,gc才会回收
text=null;
//这时候去除了软引用,也就是说变量是属于弱引用,只要gc发现了该变量,就会回收该内存
sfr.clear();
//调用gc来回收变量,理论上,虽然即是调用了gc,但是gc也不是马上会运行的,她自己会负责垃圾的回收.但是其实,一般来说,只要调用了gc,一般来说,gc是会马上运行的
System.gc();
//这时候,弱引用是拿不到值的,因为,前面调用了gc,而gc发现了变量,就会马上回收内存,所以说变量已经不存在了,自然就没有取值了.所以下面代码输出为null
System.out.println(wrf.get());
注意点:
gc回收的内存是只针对堆里面的,
所以假如我们一开始的变量是这样创建的,是可以被回收的.
String text=new String("123");
但是假如我们的变量是这样子创建了,gc就无法回收内存了,而且弱引用仍旧可以输出123的值
String text="123"
这代码只是在常量池里面创建了常量123,并没有在堆里面创建了变量new String,所以只针对堆的内存回收的gc自然就不起效果了,也就导致了常量123没有被回收,所以弱引用还可以输出值
【本文为e安在线合作讲师“刘建恒”原创稿件,转载请联系e安在线】
本文内容由快快网络小姿创作整理编辑!