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的创建? “列表”如何区分不同的实例?在每次迭代中创建对象是一种好习惯。如果不是,将对象添加到列表中的最佳解决方案是什么。
答案 0 :(得分:6)
在您的示例中,在循环的每次迭代中创建一个新对象。该列表能够区分它们,因为它不关心您在代码中将它们全部称为“a”,它通过每次调用时重新分配的引用来跟踪它们
a = new A();
每次调用该行代码时,都会在堆上创建一个新对象,并将其在内存中的地址分配给引用a。这是列表记录的引用,而不是变量名。
这是填充列表的一种非常正常和正常的方法(除了其他人提到的语法错误,我假设你可以在尝试编译代码时修复它)。
答案 1 :(得分:2)
List包含对创建的每个实例的引用。在循环中创建每个对象都很好(我假设你的意思是相反于在循环外声明'a'变量,然后在每次迭代时重新赋值)。
答案 2 :(得分:1)
在每次迭代中创建新对象是一种好习惯吗? 我的一位朋友告诉我,创建这么多实例并不是一个好习惯。
如果您需要不同的个别实例,则需要创建它们。 由于您的列表需要五个具有不同名称的对象(ram,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)是另一种创建具有特定名称的新实例的方法)