2015-10-01 3 views
1

Я прошел через SCJP экзамен и нашел одну строку в одной книге.JAVA: Сколько объектов будет создано? Зачем?

String s = new String("abc"); 

И было написано, что на вышеуказанной линии будут созданы два объекта. один на HEAP и один на STRING POOL.

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

Заранее спасибо.

+0

Если вы хотите только один объект: 'Струнный s = "abc" ' – ACV

+2

Вопрос странный. Внутренняя строка может быть создана во время загрузки класса вместе с множеством других объектов (даже если вы не выполните эту строку, у вас будет этот «abc» «интернированный»). Однако, если он уже был интернирован раньше (например, у вас есть метод в другом классе с именем 'abc'), то он не создается во время загрузки этого класса. Тем не менее при * выполнении * данной строки создается только один новый объект: новый экземпляр String. Также обратите внимание, что интернированный пул строк также находится в куче в эти дни. –

+0

Я согласен, что интернированная строка будет создана в пуле String при загрузке классов или во время компиляции. Но делает ли это то, что было создано либо во время компиляции, либо при загрузке класса в пуле строк, называется отдельным объектом? –

ответ

4

Автор прав. Когда вы когда-либо использовали литерал String, этот литерал сначала переходит в постоянный пул.

Следовательно, «abc» создается в постоянном пуле.

И когда вы используете новое ключевое слово, новый объект называется s, созданный на куче.

2

Создан и интернирован литерал "abc" («пул строк»).

Оператор new создаст новый String, который не интернирован.

1

Автор правильно:

  • один объект будет создан в строке пула для «Азбуки» буквальное; и
  • другой объект будет создан в куче для новой строки (...)
1

Объект 1 - "abc"

Объект 2 - new String("abc")

Смежные вопросы