В чем разница между назначением и созданием экземпляра строки? - PullRequest
8 голосов
/ 01 февраля 2010

В вопросе интервью, интервьюер спросил меня

Что общего и чем отличаются следующие утверждения:

String s = "Test";

String s = new String("Test");

Есть ли разница в распределении памяти?

Ответы [ 5 ]

9 голосов
/ 01 февраля 2010
String s = "Test"; 

Сначала будет искать строку «Test» в пуле строковых констант. Если найдены s, будут сделаны ссылки на найденный объект. Если объект не найден, создается новый объект String, добавляется в пул и создается s для ссылки на вновь созданный объект.

String s = new String("Test");

Сначала создаст новый строковый объект и заставит s ссылаться на него. Кроме того, запись для строки «Test» производится в пуле строковых констант, , если ее там еще нет.

Таким образом, предполагая, что строка «Test» отсутствует в пуле, первое объявление создаст один объект, а второе создаст два объекта.

5 голосов
/ 01 февраля 2010

Разница в терминах памяти заключается в том, что выражения формы: String s = "test" использует "внутреннюю" строку для совместного использования уникальных экземпляров.

Вызов формы: String s = "test"
эффективен по сравнению с String s = new String("test")

Первый вызов использует существующее константное выражение (если оно есть), второй вызов создает новый экземпляр без использования какого-либо существующего экземпляра.

Ниже фрагмент кода демонстрирует это:
</p> <pre><code>String test = new String("test"); String internTest = "test"; String nonInternTest = new String("test"); System.out.println(test == internTest); // prints false System.out.println(test != nonInternTest); // prints true System.out.println(test.equals(nonInternTest)); // prints true

Также обратите внимание, что JLS определяет поведение таким образом:
Каждый строковый литерал является ссылкой на экземпляр класса String (§4.3.3).Строковые объекты имеют постоянное значение.Строковые литералы, или, в более общем смысле, строки, являющиеся значениями константных выражений, «интернируются», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

1 голос
/ 01 февраля 2010

String s = "Тест"; // создает один объект String и одну ссылочную переменную В этом простом случае «Test» будет идти в пул, а s будет ссылаться на него.

String s = new String ("Test"); // создает два объекта и одну ссылочную переменную В этом случае, поскольку мы использовали ключевое слово new, Java создаст новый объект String. в обычной (не пула) памяти, и s будет ссылаться на него. Кроме того, буквальное «Тест» будет быть помещенным в бассейн.

но их объединяет то, что все они создают новый объект String с значение «Test» и присвоить его эталонной переменной s.

0 голосов
/ 06 июля 2010

+ Разница между созданием нового объекта String и созданием ссылки не что иное, как мы говорим jvm для создания нового объекта. и создать защиту означает, что мы создаем объект только для себя.

0 голосов
/ 01 февраля 2010

Сначала выполняется поиск строкового литерала «Test» в пуле String. Если он присутствует, то s ссылается на него и не создает новый. и создает новый объект, только когда литерал «Test» отсутствует.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...