Ответ
В Java строки хранятся в пуле строк (String Pool). При создании строки через литерал (String s = "text") JVM сначала проверяет пул на наличие такой строки. Если строка есть, возвращается ссылка на существующий объект, иначе создаётся новый.
При использовании конструктора (new String("text")) всегда создаётся новый объект в куче, даже если такая строка уже есть в пуле.
Пример:
String s1 = "hello"; // Пул строк
String s2 = "hello"; // Та же ссылка, что и s1
String s3 = new String("hello"); // Новый объект в куче
System.out.println(s1 == s2); // true (один объект)
System.out.println(s1 == s3); // false (разные объекты)
Для сравнения содержимого используйте equals().