как jvm обрабатывает создание объекта внутри цикла - PullRequest
0 голосов
/ 27 мая 2009
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 ]

6 голосов
/ 27 мая 2009

В вашем примере новый объект создается на каждой итерации цикла. Список может различать их, потому что он не заботится о том, чтобы вы называли их все «a» в вашем коде, он отслеживает их по ссылке, которая переназначается при каждом вызове

a = new A();

Каждый раз, когда вызывается эта строка кода, в куче создается новый объект, и его адрес в памяти присваивается ссылке a. Это та ссылка, в которой хранится список, а не имя переменной.

Это идеальный и нормальный способ заполнения списка (кроме синтаксических ошибок, упомянутых другими, которые, я полагаю, вы можете исправить, когда пытаетесь скомпилировать код).

2 голосов
/ 27 мая 2009

Список содержит ссылку на каждый экземпляр объекта, который создается. Можно создать каждый объект внутри цикла (я предполагаю, что вы имеете в виду, а не объявляете переменную 'a' вне цикла, а затем повторно назначаете ее на каждой итерации).

1 голос
/ 27 мая 2009

Если мое понимание JVM правильное, отправленный код не будет иметь разницы в производительности по сравнению с

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

(конечно, при условии, что конструктор A (String s) - это еще один способ создания нового экземпляра с определенным именем)

1 голос
/ 27 мая 2009

Является ли хорошей практикой создание нового объекта на каждой итерации? Один из моих друзей сказал мне, что создавать такие экземпляры не очень хорошая практика.

Если вам нужны разные отдельные экземпляры, вам нужно их создать. Поскольку вашему списку нужно пять объектов с разными именами (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); 
}
...