在下面的示例中,浮点值0.5可以在其中添加()编辑的代码块之外访问:
ArrayList<Float> myFloatArray = new ArrayList<Float>();
{
myFloatArray.add( 0.5f );
}
// Data is accessible out of the block
有人可以解释在对象实例方面会发生什么吗?当我们离开定义的块时,为什么Float对象不会被破坏?它等同于写作
myFloatArray.add( new Float(0.5f) );
我问这个的原因是我想为每个浮点值添加一个时间信息。我想创建一个能让我写的课程:
myDataPointArray.add( new dataPoint( new GregorianCalendar(2011, 11, 11), 0.5f );
但是,(正如预期的那样),ArrayList在块外部是空的,数据是add()ed。我试图让我的课程一成不变,因为我认为它可能会有所帮助,但它不会更好。有人能指出我记录这种行为的正确位置吗?我无法找到它,我认为它超出了这个ArrayList示例。
答案 0 :(得分:3)
当我们离开定义的块时,为什么Float对象不被破坏?
因为Java对象是在堆上分配的。没有像堆栈分配这样的概念。只要任何内容仍然具有对象的引用(myFloatArray
在这种情况下有一个),该对象就不符合垃圾收集的条件,从而无法进行后续破坏。
答案 1 :(得分:1)
只要ArrayList
仍在使用中,添加到ArrayList
的所有对象都将驻留在内存中。
至于你的第二个问题,myDataPointArray
永远不会丢失你添加到它的任何对象,除非你从列表中删除对象。
在ArrayList
操作之后,您确定没有在myDataPointArray
的其他地方重新分配新的add
对象吗?
答案 2 :(得分: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,因为它是独家新闻之外的列表大小。