ArrayList.add()的对象实例化?

时间:2011-12-11 12:20:57

标签: java

在下面的示例中,浮点值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示例。

3 个答案:

答案 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,因为它是独家新闻之外的列表大小。