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