Разница в терминах памяти заключается в том, что выражения формы: String s = "test"
использует "внутреннюю" строку для совместного использования уникальных экземпляров.
Вызов формы: String s = "test"
эффективен по сравнению с String s = new String("test")
Первый вызов использует существующее константное выражение (если оно есть), второй вызов создает новый экземпляр без использования какого-либо существующего экземпляра.
Ниже фрагмент кода демонстрирует это:
</p>
<pre><code>String test = new String("test");
String internTest = "test";
String nonInternTest = new String("test");
System.out.println(test == internTest); // prints false
System.out.println(test != nonInternTest); // prints true
System.out.println(test.equals(nonInternTest)); // prints true
Также обратите внимание, что JLS определяет поведение таким образом:
Каждый строковый литерал является ссылкой на экземпляр класса String (§4.3.3).Строковые объекты имеют постоянное значение.Строковые литералы, или, в более общем смысле, строки, являющиеся значениями константных выражений, «интернируются», чтобы обмениваться уникальными экземплярами, используя метод String.intern.