jvm如何处理在循环内创建对象

时间:2009-05-27 02:40:37

标签: java performance jvm

List list = new ArrayList();


String[] test = {"ram", "mohan", "anil", "mukesh", "mittal"};

for(int i =0; i < test.length; i++)

{

  A a = new A();

  a.setName(test[i]);

  list.add(a);

}

JVM如何处理每个循环中对象a的创建? “列表”如何区分不同的实例?在每次迭代中创建对象是一种好习惯。如果不是,将对象添加到列表中的最佳解决方案是什么。

4 个答案:

答案 0 :(得分:6)

在您的示例中,在循环的每次迭代中创建一个新对象。该列表能够区分它们,因为它不关心您在代码中将它们全部称为“a”,它通过每次调用时重新分配的引用来跟踪它们

a = new A();

每次调用该行代码时,都会在堆上创建一个新对象,并将其在内存中的地址分配给引用a。这是列表记录的引用,而不是变量名。

这是填充列表的一种非常正常和正常的方法(除了其他人提到的语法错误,我假设你可以在尝试编译代码时修复它)。

答案 1 :(得分:2)

List包含对创建的每个实例的引用。在循环中创建每个对象都很好(我假设你的意思是相反于在循环外声明'a'变量,然后在每次迭代时重新赋值)。

答案 2 :(得分:1)

  

在每次迭代中创建新对象是一种好习惯吗?   我的一位朋友告诉我,创建这么多实例并不是一个好习惯。

如果您需要不同的个别实例,则需要创建它们。 由于您的列表需要五个具有不同名称的对象(r​​am,mohan,anil等),因此每次迭代循环都需要一个新对象。你还要怎么存储五个名字?

至于在循环之外声明变量a,我认为这不会在性能方面产生差异,也会降低可读性。

A a;  // dont do this
for(int i =0; i < test.length; i++){
  a = new A();
  a.setName(test[i]);
  list.add(a);
}

您可能对for-each循环感兴趣

for(String name: test){
   A a = new A();
   a.setName(name);
   list.add(a); 
}

答案 3 :(得分:1)

如果我对JVM的理解是正确的,那么与

相比,发布的代码没有性能差异
for (String name : test )
{
   list.add(new A(name));
}

(当然,假设构造函数A(String s)是另一种创建具有特定名称的新实例的方法)