
При создании объекта String с помощью оператора "=", новый объект создаётся только один раз и записывается в строковый пул. При повторной попытке создать объект через "=" с таким же содержимым, новый объект не создастся, а вернётся уже существующий в строковом пуле.
Т.о. ссылочные переменные будут ссылаться на один и тот же объект, т.е. ссылки будут равны.
String morn = "Morning"; // Создался объект в строковом пуле
String morn2 = "Morning"; // Новый объект не создавался. morn2 ссылается
//на тот же объект, который уже есть в строковом пуле
String morn3 = new String("Morning"); // Создался новый объект с содержимым "Morning"
System.out.println(morn == morn2); // true
System.out.println("Morning" == morn); //true. "Morning" не создавался, а был взят из строкового пула
System.out.println(morn == morn3); //false
Если строка создаётся посредством строковых операций, то она уже не будет храниться в строковом пуле. Соответственно, операция "==" вернёт false.
String s = "bird";
s = s.concat("s");
System.out.println(s); // birds
System.out.println(s == "birds"); // false