Каково различие Между Экземпляром Присвоения и Создания Строки?

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

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

String s = "Test";

String s = new String("Test");

Есть ли какое-либо различие в выделении памяти?

8
задан codaddict 1 February 2010 в 06:42
поделиться

5 ответов

String s = "Test"; 

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

String s = new String("Test");

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

Итак, предполагая, что строки "Test" нет в пуле, первое объявление создаст один объект, а второе - два объекта.

9
ответ дан 5 December 2019 в 11:24
поделиться

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

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

0
ответ дан 5 December 2019 в 11:24
поделиться

Отличие в терминах памяти в том, что выражения формы : Строка s = "test" использует "interned" строку для обмена уникальными экземплярами.

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

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

Ниже приведенный фрагмент кода демонстрирует следующее:

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.

5
ответ дан 5 December 2019 в 11:24
поделиться

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

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

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

.
1
ответ дан 5 December 2019 в 11:24
поделиться

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

0
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: