Жизненный цикл объекта в управлении Java и памятью?

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

Мне нужна ясность в создании объекта. Многие источники, которые я прочитал, не разрабатываются. Я запутался, когда объект будет уничтожен.

String a="MAM"+"BCD"+"EFG"+"GFE";

Сколько объектов будет создано?

Я ищу хороший материал о жизненном цикле объектов, методов и классов и о том, как JVM обрабатывает их, когда они динамически изменяются и изменяются.

Ответ 1

Точно один объект создается и помещается в пул констант, если он уже не существует, и в этом случае используется существующий объект. Компилятор объединяет строковые константы вместе, как указано в JLS 3.10.5 и 15.28.

Длинный строковый литерал всегда может быть разбит на более короткие фрагменты и написан как выражение (возможно в скобках) с использованием оператора конкатенации строк +

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

Ответ 2

"MAM"+"BCD"+"EFG"+"GFE" - выражение константы времени компиляции, и оно компилируется в строковый литерал "MAMBCDEFGGFE". JVM создаст экземпляр String из этого литерала при загрузке класса, содержащего вышеуказанный код, и поместит этот String в пул строк. Таким образом, String a = "MAM"+"BCD"+"EFG"+"GFE"; не создает никакого объекта, см. JLS 15.18.1. String Concatenation Operator +

Объект String только что создан (§12.5), если выражение не является выражением постоянной времени компиляции (§15.28).

Он просто присваивает ссылку объекту String в пуле локальному var a.

Ответ 3

Создается только один объект.

string s1 = "java";
string s2 = "ja" + "va";
s.o.p(s1==s2);

Оператор возвращает true.

String s1="java";
string s2 = "ja";
String s3 = s2 +"va";
s.o.p(s1==s3);

Оператор возвращает false.

Таким образом, минимум один видимый должен быть постоянным, тогда оператор "+" генерирует новый строковый объект (в непостоянном пуле с использованием new()). Таким образом, у заданного вами вопроса нет и постоянного. Это означает, что он создает только один объект.

Ответ 4

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

Однако никто до сих пор не упомянул, что String сам содержит ссылку на внутренний char[] (который также находится в пуле констант).

Резюме. В пуле констант есть два объекта (String и char[]). Линия не создает и не разрушает какой-либо объект.

И в отношении:

Я запутался, когда объект будет уничтожен.

Ни один объект не уничтожается, поскольку материал в постоянном пуле будет уничтожен только в том случае, если сам класс будет выгружен. В лучшем случае вы можете сказать, что ссылка a в конечном итоге исчезнет.

Ответ 5

Создается только один объект, поскольку String a будет скомпилирован в "MAMBCDEFGGFE".

Ответ 6

Ответы, указывающие на один объект кучи в вашем примере, верны. Однако рассмотрите этот код:

public class Tester
{
   public String a="MAM";
   public String b ="BCD";
   public String c = "EFG";
   public String d ="GFE";

   public Tester()
   {
      String abcd = a + b + c + d;
   }
}

В этом примере создается 7 строк. a, b, c и d не скомпилированы в одну константу - они являются членами. 1 строка создается для каждого оператора + - семантически говоря, + - это конкатенация, но логически она создает новую строку в памяти. Первые 2 строки оператора немедленно отбрасываются и теперь имеют право на сбор мусора, но все еще происходит отток памяти.

Технически там в восьмом объекте. Экземпляр Тестера.

Изменить: в комментариях это было глупостью