本文目錄一覽:
北大青鳥java培訓:java編程引用類型分析?
我們在使用java編程開發語言開發軟體的時候通常都會new對象,然後通過對對象的引用來實現不同的編程需求,而今天電腦培訓就一起來了解一下,java編程開發語言中都有哪些常見的引用方法。
1:虛引用1.1簡介:虛引用是所有引用中強度弱的,它完全類似於沒有引用,在java.reflact.PhantomReference類中實現。
虛引用對象本身沒有太大影響,對象甚至感覺不到虛引用的存在。
如果一個對象存在虛引用,那麼它和沒有引用的效果大致相同,虛引用無法引用任何堆中的對象作用:虛引用主要用於跟蹤對象被JVM垃圾回收的狀態,可以通過它來手機GC的行為。
可以通過檢查與虛引用關聯的引用隊列中是否已經包含指定的虛引用,從而了解虛引用鎖引用的對象是否被回收。
注意:虛引用無法單獨使用,虛引用必須和引用隊列(ReferenceQueue)聯合使用.被虛引用所引用對象被垃圾回收後,虛引用將被添加到引用隊列中。
2:弱引用簡介:弱引用和虛引用有點類似,不同之處在於虛引用鎖引用的對象生存期比虛引用長一點。
虛引用在java.reflact.WeakReference類實現。
在系統進行垃圾回收的時候,不管系統內存是否足夠,總是回收該對象所佔用的內存.但是弱引用的強度是要大於虛引用的3:軟引用簡介:軟引用比弱引用的強度高一點,它是通過java.reflact.SoftReference來實現。
對於軟引用來說,當系統內存空間足夠時,它不會被系統回收,程序中改對象的引用也是有效的。
而當系統的內存空間不夠時,系統將會回收它。
作用:軟引用是強引用好的替代,它一定程度上可以避免系統內存不足的異常,可以充分使用軟引用來解決內存緊張的問題。
4:強引用簡介:強引用很常見,在平時的程序中,我們新new一個對象,比如Objectobject=newObject();那麼這個object就是指向object對象的強引用。
強引用的特點就是:被引用的java對象絕對不會被垃圾回收機制回收,即使系統的內存非常緊張,即使java以後也用不到,jvm不會回收強引用所引用的java對象。
java中引用是什麼??
關於java中的引用 我覺得在”think in java”這本書裡面講得很好 在那本書里 他們把引用叫做”句柄”(Handle)
java中就是用”句柄”來操縱對象的
在java中 任何東西都可以看作是對象 因此,我們可採用一種統一的語法,任何地方均可照搬不誤。但要注意,儘管將一切都「看作」對象,但操縱的標識符實際是指向一個對象的「句柄」(Handle)。在其他Java參考書里,還可看到有的人將其稱作一個「引用」,甚至一個「指針」。可將這一情形想像成用遙控板(句柄)操縱電視機(對象)。只要握住這個遙控板,就相當於掌握了與電視機連接的通道。但一旦需要「換頻道」或者「關小聲音」,我們實際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(對象)。如果要在房間里四處走走,並想保持對電視機的控制,那麼手上拿著的是遙控板,而非電視機。
此外,即使沒有電視機,遙控板亦可獨立存在。也就是說,只是由於擁有一個句柄,並不表示必須有一個對象同它連接。
java 中的引用是什麼意思?
在java實現某個功能的時候,會將類實例化成對象,然後jvm再對實例化後的對象進行操作。
實例化後的對象可以賦值,也可以引用。賦值時,java會開闢一個新的地址用於存放變數,而引用則不開闢地址。
String a = “a”;
String b = “a”;
將String類實例化成對象a與b,並賦值
String c = new String(“a”);
將c指向new出來的String型對象”a”
System.out.println(a==b);
System.out.println(a==c);
由於a與b都為對象賦值,列印出來的結果應該是true
而c是引用對象「a」,所以列印出來的結果應該是false
對象:一個類的具體實例化;
引用:對象的別名,使用該別名可以存放該對象,編譯器不會為引用分配空間,新對象與源對象共用一個存儲地址空間;引用的生命周期是它所引用的對象的生命周期,函數里返回一個局部對象的引用是很危險的
給你推薦一種最簡單的理解方式:引用就好比是給商品貼的標籤,你通過標籤可以拿到這個商品…….我開始就是這麼理解的,後來用多了就意會啦…..
java三個引用類型
四種引用類型
所以在 JDK.1.2 之後,Java 對引用的概念進行了擴充,將引用分為了:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4 種,這 4 種引用的強度依次減弱。
一,強引用
Java中默認聲明的就是強引用,比如:
Object obj = new Object(); //只要obj還指向Object對象,Object對象就不會被回收
obj = null; //手動置null
只要強引用存在,垃圾回收器將永遠不會回收被引用的對象,哪怕內存不足時,JVM也會直接拋出OutOfMemoryError,不會去回收。如果想中斷強引用與對象之間的聯繫,可以顯示的將強引用賦值為null,這樣一來,JVM就可以適時的回收對象了
二,軟引用
軟引用是用來描述一些非必需但仍有用的對象。在內存足夠的時候,軟引用對象不會被回收,只有在內存不足時,系統則會回收軟引用對象,如果回收了軟引用對象之後仍然沒有足夠的內存,才會拋出內存溢出異常。這種特性常常被用來實現緩存技術,比如網頁緩存,圖片緩存等。
在 JDK1.2 之後,用java.lang.ref.SoftReference類來表示軟引用。
下面以一個例子來進一步說明強引用和軟引用的區別:
在運行下面的Java代碼之前,需要先配置參數 -Xms2M -Xmx3M,將 JVM 的初始內存設為2M,最大可用內存為 3M。
首先先來測試一下強引用,在限制了 JVM 內存的前提下,下面的代碼運行正常
public class TestOOM {
public static void main(String[] args) {
testStrongReference();
}
private static void testStrongReference() {
// 當 new byte為 1M 時,程序運行正常
byte[] buff = new byte[1024 * 1024 * 1];
}
}
但是如果我們將
byte[] buff = new byte[1024 * 1024 * 1];
替換為創建一個大小為 2M 的位元組數組
byte[] buff = new byte[1024 * 1024 * 2];
則內存不夠使用,程序直接報錯,強引用並不會被回收
接著來看一下軟引用會有什麼不一樣,在下面的示例中連續創建了 10 個大小為 1M 的位元組數組,並賦值給了軟引用,然後循環遍歷將這些對象列印出來。
public class TestOOM {
private static ListObject list = new ArrayList();
public static void main(String[] args) {
testSoftReference();
}
private static void testSoftReference() {
for (int i = 0; i 10; i++) {
byte[] buff = new byte[1024 * 1024];
SoftReferencebyte[] sr = new SoftReference(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
}
}
列印結果:
我們發現無論循環創建多少個軟引用對象,列印結果總是只有最後一個對象被保留,其他的obj全都被置空回收了。
這裡就說明了在內存不足的情況下,軟引用將會被自動回收。
值得注意的一點 , 即使有 byte[] buff 引用指向對象, 且 buff 是一個strong reference, 但是 SoftReference sr 指向的對象仍然被回收了,這是因為Java的編譯器發現了在之後的代碼中, buff 已經沒有被使用了, 所以自動進行了優化。
如果我們將上面示例稍微修改一下:
private static void testSoftReference() {
byte[] buff = null;
for (int i = 0; i 10; i++) {
buff = new byte[1024 * 1024];
SoftReferencebyte[] sr = new SoftReference(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
System.out.println(“buff: ” + buff.toString());
}
則 buff 會因為強引用的存在,而無法被垃圾回收,從而拋出OOM的錯誤。
如果一個對象惟一剩下的引用是軟引用,那麼該對象是軟可及的(softly reachable)。垃圾收集器並不像其收集弱可及的對象一樣盡量地收集軟可及的對象,相反,它只在真正 「需要」 內存時才收集軟可及的對象。
三,弱引用
弱引用的引用強度比軟引用要更弱一些,無論內存是否足夠,只要 JVM 開始進行垃圾回收,那些被弱引用關聯的對象都會被回收。在 JDK1.2 之後,用 java.lang.ref.WeakReference 來表示弱引用。
我們以與軟引用同樣的方式來測試一下弱引用:
private static void testWeakReference() {
for (int i = 0; i 10; i++) {
byte[] buff = new byte[1024 * 1024];
WeakReferencebyte[] sr = new WeakReference(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
}
列印結果:
可以發現所有被弱引用關聯的對象都被垃圾回收了。
四,虛引用
虛引用是最弱的一種引用關係,如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,它隨時可能會被回收,在 JDK1.2 之後,用 PhantomReference 類來表示,通過查看這個類的源碼,發現它只有一個構造函數和一個 get() 方法,而且它的 get() 方法僅僅是返回一個null,也就是說將永遠無法通過虛引用來獲取對象,虛引用必須要和 ReferenceQueue 引用隊列一起使用。
public class PhantomReferenceT extends ReferenceT {
/**
* Returns this reference object’s referent. Because the referent of a
* phantom reference is always inaccessible, this method always returns
* codenull/code.
*
* @return codenull/code
*/
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue? super T q) {
super(referent, q);
}
}
那麼傳入它的構造方法中的 ReferenceQueue 又是如何使用的呢?
五,引用隊列(ReferenceQueue)
引用隊列可以與軟引用、弱引用以及虛引用一起配合使用,當垃圾回收器準備回收一個對象時,如果發現它還有引用,那麼就會在回收對象之前,把這個引用加入到與之關聯的引用隊列中去。程序可以通過判斷引用隊列中是否已經加入了引用,來判斷被引用的對象是否將要被垃圾回收,這樣就可以在對象被回收之前採取一些必要的措施。
java 什麼是引用?
String s = new String();s就是引用,說它是引用是就它的行為而言的,s引用著一個對象,換句話說就是s指向了一個對象;不是Java中沒有指針,其實Java到處都是指針,在我們編碼這個角度來看,s就是引用,言外之意就是你無法直接操作一個對象,你要想操作一個對象你必須通過該對象的引用!這也是為什麼叫引用。在我們看來Java確是屏蔽了指針的複雜操作,這只是為我們編程帶來方便,但是真正在運行時,在Java程序跑起來之後,會將引用轉換成一個指針,s這個引用被轉換為一個指針,真真正正的指向了內存中存儲體的某個存儲單元的某些位某些01; 回答人的補充 2009-09-20 03:39 對象是對象!引用時引用!這是兩個不同的概念,上面怎麼能說對象就是引用呢?只不過我們是通過引用操作對象,引用是一塊內存,對象是另一塊內存!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/285565.html