Java string intern и literal

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

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

Ответ 1

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

Две релевантные цитаты из String#intern:

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

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

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

Ответ 2

public String intern()

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

Итак, я верю, что ответ да, хотя второму методу придется искать через пул.

ИЗМЕНИТЬ

В соответствии с T.J. Crowder

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

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

Ответ 3

Первый, т.е.

    String foo = "foo";

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

Во втором, т.е. -

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

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

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

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

Ответ 4

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

Ответ 5

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

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