はじめに:"t" + "e"
コンパイラによって最適化されるため、文字列リテラルです。この文字列リテラルは、次の行でも使用されています。
String a = new String("te");
ここで、String(String)
コンストラクターは文字列の物理コピーを作成します。したがって、これは a
とが同じオブジェクトでd
はないことを意味します。
その後: 2 つの文字列をString.equals(String)
比較します。オブジェクトではなくコンテンツが等しいかどうかを示します。これは、同じ文字シーケンスを持つ 2 つの異なる String オブジェクトが存在する可能性があることを意味しString.equals(String)
ますtrue
。
String.intern()
String がまだ String プールにない場合は、String を String プールに入れます。ただし、このメソッドはオブジェクト自体を変更できません。したがって、このコード例は false を出力します。
String literal = "lit";
String nonLiteral = "abclit".substring(3); // equals "lit"
nonLiteral.intern(); // "lit" was already in the String pool
// but `nonLiteral` is still `nonLiteral`
System.out.println(literal == nonLiteral); // false
ただし、これを行うと、true が返されます。
String literal = "lit";
String nonLiteral = "abclit".substring(3); // equals "lit"
nonLiteral = nonLiteral.intern(); // "lit" was already in the String pool and
// it will return the object `literal`.
// Now the value is replaced.
System.out.println(literal == nonLiteral); // true