搜索
写经验 领红包

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安在线】

本文内容由快快网络小姿创作整理编辑!