JAva String文字列でよく見られる比較的等しい問題


String s1 = "HelloWorld";
String s2 = "World";
String s3 = "HelloWorld";
System.out.println(s3 == s1 + s2); // false
System.out.println(s3.equals(s1 + s2)); //true
System.out.println(s3 == ("Hello" + "World"));//true
System.out.println(s3.equals(s1 + s2));//true

1つ目がfalseなのは、s 3とs 1+s 2を比較するときに==を使うからです. 比較は変数に格納されているアドレス値を参照し,まずs 1+s 2のために新しいメモリ空間を開き,文字列をつなぎ合わせて格納する.
s 3.equals(s 1+s 2)、Stringクラスはequals()メソッドを書き換えているので、文字列自体を比較します
s3 == "Hello"+ "World"; まずHelloとworldをつなぎ合わせて、それから彼らの住所の価値を比較して、Hello Worldのつなぎ合わせが完成した後、文字列定数プールの中でHello Worldの結果が存在するかどうかを照会して、もう作成しないで、だから比較する住所の値はちょうどs 3の文字列の記憶する住所です
s 3.equals(s 1+s 2)equals()メソッドを書き換えたので,結果は間違いなくtrueである.
文字列が変数であれば、例えばs 1 s 2はまず空間を開き(この空間が文字列定数プールにあるべきかを自分で理解し)、それからつなぎ合わせる
文字列が定数であれば「Hello」「World」のように先につなぎ合わせ、定数プールで探し、あれば定数プールのアドレスを返し、なければ作成します.