2013-08-07 53 views
4

我對堆棧的pop方法這段代碼,我想弄清楚它是如何避免遊蕩,同時還返回,我們的指標目前指向的元素:java的遊蕩和垃圾收集

public String pop() 
{ // Remove item from top of stack. 
String item = a[--N]; 
a[N] = null; // Avoid loitering (see text). 
if (N > 0 && N == a.length/4) resize(a.length/2); 
return item; 
} 

從我可以理解的,我們將我們的String對象的引用項目指向我們數組a的索引元素(我們從最後一個使用它的當前大小爲N-1的元素開始,因此是遞減)。那麼如果我們要返回引用,爲什麼我們在設置引用指向null的索引元素之前呢?這是不是讓這個項目指向什麼也不返回?

+0

Java中的引用始終是_copied_,所以通過修改數組中的內容,您不會更改從中得到的內容。 –

回答

15

只要可以訪問,對象就不能垃圾收集。如果只是簡單地使用--N更改索引,但不要取消a[N],則將保留對該對象的引用,即使客戶端代碼不再引用該對象,也會阻止其垃圾回收。

這是您需要在Java中取消變量的唯一情況之一。

你似乎也誤解了什麼是參考。 a[N]包含一個指向內存中的對象的值。當你寫String item = a[N]時,你將該值複製到變量item。兩個變量(itema[N])現在都引用同一個對象。然後,當您寫入a[N] = null時,將從數組中刪除該引用,但item仍包含指向原始對象的值。

+0

啊對a也是一個引用,但是對於數組對象。我明白謝謝你。 – user2644819

+0

因此,您正在將數組的引用(我們對象的內存位置)複製到String對象的項引用。所以現在item指向數組對象。將我們的引用a設置爲null將取消引用它,因爲我們不再需要它了。問題:數組是否有多個引用,如C++如何與內存一起工作(每個索引指向內存中的某個空間)?所以基本上我們只是去引用它的某個部分(所以垃圾收集器可以收集)? – user2644819

+0

@ user2644819項不指向數組對象。它指向與'a [N]'指向的相同的對象。這篇文章可能會讓事情更清晰:http://stackoverflow.com/questions/40480/is-java-pass-by-reference – assylias

2

副本數組中的引用。它不引用數組成員。

String item = a[--N]; 

現在你有兩個對同一個對象的引用,一個在局部變量中,另一個在數組中。這將刪除陣列中的副本:

a[N] = null; // Avoid loitering (see text). 

如果未將它從數組中移除,則不必要的引用將繼續存在,從而防止垃圾收集。