Строковый Java-текст и литерал - PullRequest
12 голосов
/ 25 апреля 2011

Являются ли следующие два кода одинаковыми?

String foo = "foo";
String foo = new String("foo").intern();

Ответы [ 5 ]

14 голосов
/ 25 апреля 2011

У них один и тот же конечный результат , но они не одинаковы (они будут генерировать другой байт-код; версия new String("foo").intern() фактически проходит эти шаги, создавая новый строковый объект, а затем интернируя его).

Две соответствующие цитаты из String#intern:

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

Все литеральные строки и строковые константные выражения интернируются.

Таким образом, конечный результат такой же: переменная, ссылающаяся на интернированную строку "foo".

4 голосов
/ 25 апреля 2011

public String intern()

Отсюда следует, что для любых двух строк s и т s.intern() == t.intern() истина, если и только если s.equals(t) true.

Так что я считаю, что ответ - да, хотя второй метод должен будет искать в пуле.

EDIT

По предположению Т.Дж. Crowder

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

Все литеральные и строковые значения константные выражения интернированы.

3 голосов
/ 25 декабря 2013

Первый, т.е.

    String foo = "foo";

в этой строке, мы создаем строку с использованием литералов строки.Это означает, что строка автоматически сохраняется в пуле String Constant.

Во 2-м, то есть -

    String foo = new String("foo").intern();

Здесь мы создаем String с помощью new String () и затем сохраняем его вручнуюв строковый постоянный пул.Если бы у нас не было упоминаний intern (), он бы не сохранялся в пуле констант String.

Для получения дополнительной информации, пожалуйста, перейдите по этой ссылке -

http://javacodingtutorial.blogspot.com/2013/12/comparing-string-objects-intern-other.html

0 голосов
/ 25 апреля 2011

Явное создание новой строки объект инициализирован в литерал производит не интернированный Строка. (Вызывая intern () на этом String вернет ссылку на Строка из внутреннего стола.)

Взято из: http://javatechniques.com/public/java/docs/basics/string-equality.html

0 голосов
/ 25 апреля 2011

Да, они одинаковы. В основном intern() возвращает представление строки, которая уникальна для виртуальной машины. Это означает, что вы можете использовать == вместо .equals() для сравнения строк, экономя на производительности.

...