В вопросе об интервью Интервьюер спросил меня
Что является общим и различием между следующими утверждениями:
String s = "Test";
String s = new String("Test");
Есть ли какое-либо различие в выделении памяти?
String s = "Test";
Сначала поищем строку "Test" в пуле строковых констант. Если найден s, то будет сделана ссылка на найденный объект. Если не найдено, то создается новый объект "String", добавляется в пул и s делается ссылка на вновь созданный объект.
String s = new String("Test");
Сначала будет создан новый объект строковой константы и сделана ссылка s на него. Дополнительно в пуле строковых констант делается запись для строки "Test", если ее там еще нет.
Итак, предполагая, что строки "Test" нет в пуле, первое объявление создаст один объект, а второе - два объекта.
Сначала в пуле строк будет произведен поиск строкового литерала "Test", если он присутствует, то s будет ссылаться на него и не будет создавать нового. и создает новый объект только тогда, когда литерала "Test" нет.
, но во втором случае он создаст другой объект, не беспокоясь о том, присутствует он или нет.
Отличие в терминах памяти в том, что выражения формы :
Строка 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.
Строка s = "Тест"; // создает один объект строки и одну опорную переменную. В этом простом случае, "Тест" пойдет в бассейн и s будет ссылаться на него.
Строка s = new String("Тест"); // создает два объекта и одну переменную-справку В этом случае, так как мы использовали новое ключевое слово, Java создаст новый объект String в нормальной (непуловой) памяти, и s будет обращаться к ней. Кроме того, буквально "Тест" будет быть помещенным в бассейн.
но что их объединяет, так это то, что все они создают новый объект Строки с значение "Test", и присваивать его опорной переменной s.
.+ Разница между созданием нового объекта String и созданием ссылки не что иное, как мы говорим jvm создать новый объект. и создать референцию означает, что мы создаем объект только для себя.