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的创建? “列表”如何区分不同的实例? 在每次迭代中创建对象是一种好习惯吗? 如果不是,将对象添加到列表中的最佳解决方案是什么。

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

 a = new A(); 

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

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

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

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

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

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

 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); } 

如果我对JVM的理解是正确的,那么发布的代码与之相比没有性能差异

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

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