Являются ли эти две части кода одинаковыми?
String foo = "foo";
String foo = new String("foo").intern();
Являются ли эти две части кода одинаковыми?
String foo = "foo";
String foo = new String("foo").intern();
Они имеют одинаковый конечный результат, но они не совпадают (они будут создавать разные байт-коды, версия new String("foo").intern()
фактически проходит эти шаги, создает новый строковый объект, а затем интернирует его).
Две релевантные цитаты из String#intern
:
Когда вызывается метод
intern
, если пул уже содержит строку, равную этому объектуString
, как определено методомequals(Object)
, возвращается строка из пула. В противном случае этот объектString
добавляется в пул и возвращается ссылка на этот объектString
.Все литералы и строковые константные выражения интернированы.
Итак, конечный результат тот же: переменная, ссылающаяся на интернированную строку "foo".
Отсюда следует, что для любых двух строк s и t,
s.intern() == t.intern()
является истинно тогда и только тогда, когдаs.equals(t)
true
.
Итак, я верю, что ответ да, хотя второму методу придется искать через пул.
ИЗМЕНИТЬ
В соответствии с T.J. Crowder
При вызове метода intern, если пул уже содержит строку равный этому объекту String как определяемый равными (Object) метод, то строка из пула возвращается. В противном случае эта строка объект добавляется в пул и ссылка на этот объект String вернулся.
Все литералы и строковые значения постоянные выражения интернированы.
Первый, т.е.
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
Да, они такие же. В основном intern()
возвращает представление строки, которая уникальна для виртуальной машины. Это означает, что вы можете использовать ==
вместо .equals()
для сравнения строк, сохраняя при этом производительность.
Явное построение новой строки объект, инициализированный литералом производит не интернированный Строка. (Вызов intern() для этого Строка вернет ссылку на Строка из таблицы intern.)
Взято из: http://javatechniques.com/public/java/docs/basics/string-equality.html