Javaは文字列の値を変更するたびに新たにオブジェクトを生成するの?

class Test {
public static void main(String[] arg){
String s1 = "abc";
String s2 = s1; //リテラルオブジェクトを共有
s1 = s1 + 'd'; //このタイミングで新たなオブジェクト1を生成しそのリファレンスをs1に代入
System.out.println("s1=" + s1 + " s2=" + s2);
s2 = s1; //オブジェクト1のリファレンスを共有
System.out.println("s1=" + s1 + " s2=" + s2);
s2 = s2.concat("e"); //s2からオブジェクト1の末尾に'e'を追加
if (s1 == s2)
System.out.println("同じ"); //同じじゃなかった
System.out.println("s1=" + s1 + " s2=" + s2); // s1もabcdeにならないのはなぜ???
}
}