Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jvm如何处理在循环中创建对象_Java_Performance_Jvm - Fatal编程技术网

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

Java jvm如何处理在循环中创建对象,java,performance,jvm,Java,Performance,Jvm,JVM如何处理每个循环中对象a的创建?不同实例之间的列表如何区分?在每次迭代中创建对象是否是一种好的做法。如果否,将对象添加到列表中的最佳解决方案是什么。列表包含对已创建对象的每个实例的引用。我假设你的意思是,在循环内创建每个对象是可以的,而不是在循环外声明“a”变量,然后在每次迭代中重新分配它。在你的示例中,循环的每次迭代都会创建一个新对象。列表能够区分它们,因为它不关心您在代码中是否将它们全部称为a,而是通过每次调用时重新分配的引用来跟踪它们 List list = new ArrayLis

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

列表包含对已创建对象的每个实例的引用。我假设你的意思是,在循环内创建每个对象是可以的,而不是在循环外声明“a”变量,然后在每次迭代中重新分配它。

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

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

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

除了其他人提到的语法错误之外,这是一种非常好且正常的填充列表的方法,我假设您可以在尝试编译代码时修复这些错误

在每次迭代中创建一个新对象是一种好的实践吗? 我的一个朋友告诉我,创建这么多实例不是一个好的做法

如果需要不同的单个实例,则需要创建它们。 因为您的列表需要五个不同名称的对象,每个对象分别是ram、mohan、anil等等,所以每次循环迭代都需要一个新对象。你还打算怎么储存这五个名字

至于在循环外部声明变量,我认为这不会对性能造成影响,也不会降低易读性

a = new A();

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

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

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

Yes。你说得对。我的一个朋友告诉我,创建这么多实例不是一个好的做法。它会降低应用程序的性能。@Shashi Bhushan:当然,除非您需要所有实例,在这种情况下,创建它们是有意义的:@但是,创建多个实例是完全可以的。会出现一个小编译错误:无法实例化类型列表。
for(String name: test){
   A a = new A();
   a.setName(name);
   list.add(a); 
}
for (String name : test )
{
   list.add(new A(name));
}