Разница в том, что новая строка создает новый объект с тем же значением, что и передаваемый литерал:
String s = "abc";
String t = new String("abc");
System.out.println(s==t); //false
String u = "abc";
String v = "abc";
System.out.println(u==v); //true
Это потому, что литерал всегда из внутреннего пула.
Возможно, вы захотите взглянуть на метод intern - вот его описание:
Возвращает каноническое представление для строкового объекта.
Пул строк, изначально пустой, поддерживается частным образом классом String.
При вызове метода intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.
Отсюда следует, что для любых двух строк s и t s.intern () == t.intern () истинно тогда и только тогда, когда s.equals (t) верно
Все литеральные строки и строковые константные выражения интернированы. Строковые литералы определены в §3.10.5 Спецификации языка Java