极悦注册教程:Java的引用类型_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 极悦注册 极悦注册教程:Java的引用类型

极悦注册教程:Java的引用类型

更新时间:2019-12-18 16:30:09 来源:极悦 浏览2166次

 

极悦注册教程:Java的引用类型

 

1.java的引用类型分为强引用,软引用,和弱引用以及虚引用.

  创建强引用

String text=new String("123");

  利用=号来创建强引用

  创建软引用

SoftReferencesfr=new SoftReference(text);

  针对上面的对象创建了一个软引用,相当于对于同一个对象123,创建了两个引用,分别是强引用和软引用

  创建弱引用

WeakReferencewrf=new WeakReference(text);

  同理,针对同一个变量创建三个引用,分别是强引用,软引用和弱引用

  另外还有最后一个虚引用,这里省略

2.关于四种引用,不同情况还有一种特性叫作及物性

  例如,不管对于一个变量,创建了多少种引用,只要存在强引用,那么这个变量就叫做强及物性,针对这种情况,垃圾回收器,也就是gc,是永远不会回

收这种变量的.

  假如,驱除了强引用,只剩下了软引用和弱引用,那么这时候这个变量就叫做软及物,针对这种情况,gc只有在内存不够的情况下,才会回收变量

  最后,驱除了强引用和软引用,只剩下弱引用的时候,gc只要发现了这个变量,就会马上回收内存.

3.案例演示

①案例一:

//在堆里面创建一个对象,即是 new String(),同时也会在常量池里面创建一个常量,即是123; 并且String text指向的是堆里面的对象

String text=new String("123");

//创建软引用

SoftReferencesfr=new SoftReference(text);

//创建弱引用

WeakReferencewrf=new WeakReference(text);

//这时候,变量是属于强引用.

System.out.println(text);

②案例二:

//在堆里面创建一个对象,即是 new String(),同时也会在常量池里面创建一个常量,即是123; 并且String text指向的是堆里面的对象

String text=new String("123");

//创建软引用

SoftReferencesfr=new SoftReference(text);

//创建弱引用

WeakReferencewrf=new WeakReference(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");

//创建软引用

SoftReferencesfr=new SoftReference(text);

//创建弱引用

WeakReferencewrf=new WeakReference(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没有被回收,所以弱引用还可以输出值

 

极悦注册教程:Java的引用类型

   以上就是极悦注册机构小编介绍的“极悦注册教程:Java的引用类型”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

       Java全套自学资料

       Java自学视频教程(免费下载学习):

      Java技术教程:

 

 相关文章

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>