2011-12-11 183 views
0

在下面的例子中,浮子值0.5是碼塊在其被添加()編的外部訪問:ArrayList.add()的對象實例化?

ArrayList<Float> myFloatArray = new ArrayList<Float>(); 
{ 
    myFloatArray.add(0.5f); 
} 
// Data is accessible out of the block 

有人可以解釋在對象instanciation方面會發生什麼?爲什麼當我們離開它定義的塊時,Float對象不會被銷燬?是否相當於寫作

myFloatArray.add(new Float(0.5f)); 

我問這個問題的原因是我想爲每個浮點值添加時間信息。我想到了創建一個類,它將使我能夠寫:

myDataPointArray.add(new dataPoint(new GregorianCalendar(2011, 11, 11), 0.5f); 

然而,(如預期),該ArrayList是塊中的數據的空外是加()版。我試圖讓我的課變得不可改變,因爲我相信這可能會有所幫助,但它並不能奏效。有人能指出我記錄此行爲的正確位置嗎?我無法找到它,我認爲它超出了這個ArrayList示例。

+2

在堆上創建的項目(即,通過'new')不具有由範圍(即程序塊)控制的生命週期。所以我不明白爲什麼你的第二個例子導致一個問題(我不希望列表是空的)。您可以創建一個自包含的測試用例(請參閱http://sscce.org)? –

回答

1

只要ArrayList仍在使用中,所有添加到您的ArrayList中的對象都將駐留在內存中。 至於你的第二個問題,myDataPointArray將永遠不會釋放你添加到它的任何對象,除非你從列表中刪除該對象。

您確定您沒有在add操作後的其他地方重新分配新的ArrayList對象到myDataPointArray

+0

**你確定在添加操作之後,你是不是將新的ArrayList對象重新分配給myDataPointArray?**是的,我是。我心情不好。但我也學到了一些關於堆分配的知識。謝謝你們。 – tos

+0

@tos很高興幫助 – GETah

3

爲什麼當我們離開它定義的塊時Float對象不會被銷燬?

因爲Java中的對象是分配在堆上的。沒有像堆棧分配這樣的概念。只要任何東西仍然有對象的引用(myFloatArray在這種情況下有一個),該對象就不符合垃圾回收的條件,從而導致後續的破壞。

1

你是arrayList不應該在塊外面是空的,在我的測試中它不是。

package se.wederbrand.stackoverflow; 

import java.util.ArrayList; 
import java.util.GregorianCalendar; 

public class SomeArrayStuff { 

    public static void main(String[] args) { 
    ArrayList<DataPoint> myDataPointArray = new ArrayList<DataPoint>(); 
    { 
     myDataPointArray.add(new DataPoint(new GregorianCalendar(2011, 11, 11), 0.5f)); 
    } 
    System.out.println(myDataPointArray.size()); 
    } 

    private static class DataPoint { 
    private GregorianCalendar gregorianCalendar; 
    private float v; 

    public DataPoint(GregorianCalendar gregorianCalendar, float v) { 
     this.gregorianCalendar = gregorianCalendar; 
     this.v = v; 
    } 
    } 
} 

這將正確打印出1,因爲這是瓢外的列表大小。

+0

是的,你確實是對的。我看到的價值並不是在退出循環之後。學過的知識 ! – tos