3.Java 引用数据类型
2016-08-06 本文已影响343人
KaelQ
1.引用数据类型概论
- 引用数据类型 变量名 这样声明的时候变量为null。
-
引用数据类型 变量名=new 引用数据类型,例如String a=new String("hi~")这时候内存存储如图:
这时候String a 在栈内存中声明了 一个内存地址,内存地址指向堆内存中new String("hi~")声明的对象。即变量名为引用的内存地址。
2.引用数据类型分类
- 类
Object object= new Integer(1); //来定义一个Interger类 - 接口
接口不能直接new进行实例化,可以引用实现接口的类。 - 数组
int[] a=new int[10];
3.引用分类
- 强引用(StrongReference)
一般使用的引用 A a =new A();
当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
一句话,空间不回收。
- 软引用(SoftReference)
当内存空间不足时,会回收软引用对象。
一句话,空间不足就回收。
//使用软引用
Stringstr=newString("hi~");
SoftReferenceaSoft = newSoftReference(str);
str=null;
//获取软引用的实例到强引用,如果已被回收,则返回null。
String str2=(String)aSoft.get();
- 弱引用(WeakReference)
在java垃圾回收期扫描它管辖的范围之内时,发现弱引用,就进行回收。
一句话,发现就回收。
//使用弱引用
Stringstr=newString("hi~");
WeakReference aWeak =new WeakReference(str);
str=null;
//获取弱引用的实例到强引用,如果已被回收,则返回null。
String str2=(String)aWeak.get();
- 虚引用(PhantomReference)
虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
一句话,任何时候回收。
虚引用必须要和ReferenceQueue一起使用。ReferenceQueue是一种队列,java虚拟机将垃圾回收的对象放入其中。(ReferenceQueue也可以和软引用或弱引用一起使用)。
Stringstr=newString("hi~");
ReferenceQueueq=newReferenceQueue ();
PhantomReferencepr=newPhantomReference (str,q);
str=null;
4.问题
- 问题如下
String str1=new String("hi~");
String str2=str1;
String str3=new String(str2);
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
结果为:
true
false
true
true