2015-07-14 2 views
2

Как мы знаем, что, когда мы создаем новый объект String, на новое ключевое слово, как это:Доступ к какому объекту String?

String str = new String("New String Will Have Two Objects"); 

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

Итак, когда мы вызываем доступ "str", к которому относится объект string (объект кучи или объект пула строк)?

По моему мнению, объект пула строк получает доступ, если да, то что происходит с кучным объектом?

+1

http://stackoverflow.com/questions/4918399/where-does-javas-string-constant-pool-live- the-heap-or-the-stack –

ответ

7

Если вы создаете объект типа String с new

String str = new String("New String Will Have Two Objects"); 

В таком случае, JVM создаст новый объект строки в обычном (не пул) динамической памяти и буквального "New String Will Have Two Objects" будут размещены в строке постоянной бассейн. Переменная str будет ссылаться на объект в куче (non pool).

Метод 'стажер() использование

Это лучше всего описывается ява Docs

Когда метод стажер вызывается, если пул уже содержит строку, равную этой строки объект, определяемый методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

String str = new String("New String Will Have Two Objects"); 

str.intern(); 
+0

Хороший ответ и проголосовали. Однако я не считаю, что «новый» имеет значение. – Shahzeb

+4

Спасибо за участие. :) Небольшая разница между прямой декларацией String и ключевым словом new - это когда вы создаете строку с двойными кавычками, она сначала проверяет пул, если она существует или нет. Если да, то верните ту же строку. В случае ключевого слова 'new' оно всегда будет создавать новую строку. – Nakul91

+0

@Nakul - В случае использования нового ключевого слова оно создало бы новую строку String on pool, даже если она уже доступна? – proudandhonour

0

new String создает новую строку в куче. Ссылка на эту строку присваивается str.

+0

Я прочитал в java doc, что он создает один объект в пуле строк, а затем что происходит с этим объектом? – proudandhonour

+0

Что значит, что с ним происходит? Это там. Каждый литерал строки имеет соответствующий объект в пуле, созданный во время компиляции. Если вы делаете 'String foo =" bar "; String quux = foo; ', будет только один объект, на который ссылаются две переменные. Если вы делаете 'String x1 = new String (foo); String x2 = new String (quux) ', две дополнительные копии будут созданы в куче и будут собираться с помощью мусора, когда' x1' и 'x2' покидают область. – Amadan

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