я задал вопрос по-interview- Сколько объектов создаются на Heap в следующем:Сколько объектов строк создаются на Heap
String s1= "A";
String s2= "A";
String s3= new String("A");
Я ответил 1 - потому, что с новым оператором только , создается строковый объект. Когда компилятор встретит s1, он просто создаст «A» в пуле строковых литералов. И s1 и s2 указывают на один и тот же литерал в литеральном пуле. Но интервьюер смутил меня, сказав, что, где этот пул существует?
Теперь в определенном блог, я прочитал:
«В более ранних версиях Java, я думаю, что до к Java 1.6 Строки буквальный бассейн расположен в PermGen районе кучи, но в Java 1.7 обновляет его перемещаемый к основной области кучи ».
Таким образом, все 3 строковые объекты создаются в куче. Не так ли?
Но s1 и s2 указывают на один и тот же литерал в пуле строковых литералов (s1 == s2 is true), поэтому отдельный объект не должен создаваться, когда встречается s2. Таким образом, необходимо создать только 2 объекта.
Может ли кто-нибудь прояснить как такое количество объектов String на Куча? Я что-то упускаю?
Да - первая строка статьи: «Как следует из названия, String Pool представляет собой пул строк, хранящихся в Java Heap Memory». Изменение в 1.7 для перехода к куче произошло в 2011 году. –
Первая строка ничего не добавляет в пул строк. «A» уже существует, так как класс загружен. Он был первоначально помещен в пул строк файла .class компилятором и объединен с помощью загрузчика классов. – EJP
Спасибо @EJP 5. Обновленный ответ на коррекцию отражения. Должен был спать уже :) –