Жизненный цикл объекта в управлении 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 строки оператора немедленно отбрасываются и теперь имеют право на сбор мусора, но все еще происходит отток памяти.
Технически там в восьмом объекте. Экземпляр Тестера.
Изменить: в комментариях это было глупостью