У них один и тот же конечный результат , но они не одинаковы (они будут генерировать другой байт-код; версия new String("foo").intern()
фактически проходит эти шаги, создавая новый строковый объект, а затем интернируя его).
Две соответствующие цитаты из String#intern
:
Когда вызывается метод intern
, если пул уже содержит строку, равную этому объекту String
, как определенометодом equals(Object)
возвращается строка из пула.В противном случае этот String
объект добавляется в пул и возвращается ссылка на этот String
объект.
Все литеральные строки и строковые константные выражения интернируются.
Таким образом, конечный результат такой же: переменная, ссылающаяся на интернированную строку "foo".