2010-02-01 3 views
8

В интервью вопроса, интервьюер спросил меняВ чем разница между присваиванием и созданием экземпляра строки?

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

String s = "Test"; 

String s = new String("Test"); 

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

+0

http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-java –

ответ

6
String s = "Test"; 

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

String s = new String("Test"); 

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

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

+1

Как я понимаю, создание lookup/object в константе пул происходит для всех литералов, происходящих в коде класса, когда этот класс загружается, а не когда эта конкретная строка кода выполняется. –

5

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

Вызов формы: String s = "test"
эффективен по сравнению с String 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 имеют постоянное значение. Строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений, «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

0

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

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

1

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

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

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

0

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

+0

Не вопрос. – Luv

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