2011-12-11 128 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