1.引用數(shù)據(jù)類型概論
- 引用數(shù)據(jù)類型 變量名 這樣聲明的時候變量為null。
-
引用數(shù)據(jù)類型 變量名=new 引用數(shù)據(jù)類型,例如String a=new String("hi~")這時候內(nèi)存存儲如圖:
這時候String a 在棧內(nèi)存中聲明了 一個內(nèi)存地址粪摘,內(nèi)存地址指向堆內(nèi)存中new String("hi~")聲明的對象。即變量名為引用的內(nèi)存地址梗顺。
2.引用數(shù)據(jù)類型分類
- 類
Object object= new Integer(1); //來定義一個Interger類 - 接口
接口不能直接new進(jìn)行實例化掘殴,可以引用實現(xiàn)接口的類赚瘦。 - 數(shù)組
int[] a=new int[10];
3.引用分類
- 強引用(StrongReference)
一般使用的引用 A a =new A();
當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯誤奏寨,使程序異常終止起意,也不會靠隨意回收具有強引用的對象來解決內(nèi)存不足的問題。
一句話病瞳,空間不回收揽咕。
- 軟引用(SoftReference)
當(dāng)內(nèi)存空間不足時,會回收軟引用對象套菜。
一句話亲善,空間不足就回收。
//使用軟引用
Stringstr=newString("hi~");
SoftReferenceaSoft = newSoftReference(str);
str=null;
//獲取軟引用的實例到強引用笼踩,如果已被回收逗爹,則返回null。
String str2=(String)aSoft.get();
- 弱引用(WeakReference)
在java垃圾回收期掃描它管轄的范圍之內(nèi)時嚎于,發(fā)現(xiàn)弱引用掘而,就進(jìn)行回收。
一句話于购,發(fā)現(xiàn)就回收袍睡。
//使用弱引用
Stringstr=newString("hi~");
WeakReference aWeak =new WeakReference(str);
str=null;
//獲取弱引用的實例到強引用,如果已被回收肋僧,則返回null斑胜。
String str2=(String)aWeak.get();
- 虛引用(PhantomReference)
虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用嫌吠,那么它就和沒有任何引用一樣止潘,在任何時候都可能被垃圾回收器回收。
一句話辫诅,任何時候回收凭戴。
虛引用必須要和ReferenceQueue一起使用。ReferenceQueue是一種隊列炕矮,java虛擬機(jī)將垃圾回收的對象放入其中么夫。(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));
結(jié)果為:
true
false
true
true