-1

理解できないこのコードがあります。最初は2つの同一の文字列を見ることができます。演算子を使用してそれらを比較すると、メソッド==と同じようにtrueと表示されequals()ますが、実行時に2つの同一の文字列を作成すると、演算子==はfalseと表示されます。なぜこうなった ?

同一の文字列をハードコーディングすると、メモリ内の同じ位置に配置され、両方の参照がそれを指すということですか? 同様の質問を見つけましたが、明確な回答はありませんでした。

public class StringTesting {
    public static void main(String[] args){
        String string1 = "hello";                   //\
                                                    // } same place in the memory ?
        String string2 = "hello";                   ///

        System.out.println(string1 == string2);     //true
        System.out.println(string1.equals(string2));      //true

        String string3 = "hey";
        String string4 = "he";

        System.out.println(string3 == string4);          //false
        System.out.println(string3.equals(string4));     //false

        string4 += "y";

        System.out.println(string3 == string4);          //false ????
        System.out.println(string3.equals(string4));     //true

        System.out.println(string3 + " " + string4);      //hey hey
    }
}
4

3 に答える 3

4

次の複合代入演算子:

string4 += "y";

実行時に文字列連結を実行します。の値はstring4実行時にのみ評価されるためです。また、実行時に文字列を連結すると、新しいオブジェクトが作成されます。

JLS セクション 3.10.5から(このセクションの終わりの方を参照):

実行時に連結によって計算された文字列は新しく作成されるため、区別されます。

ただし、2 つの文字列リテラルを連結しても、別のオブジェクトは作成されません。したがって、次のコードは次を返しtrueます。

"he" + "y" == "hey";

その JLS セクションには、さまざまな文字列連結の例のコード セグメントが含まれています。

String hello = "Hello", 
String lo = "lo";

System.out.print((hello == "Hello") + " ");          // true
System.out.print((Other.hello == hello) + " ");      // true
System.out.print((other.Other.hello == hello) + " ");// true
System.out.print((hello == ("Hel" + "lo")) + " ");     // true
System.out.print((hello == ("Hel" + lo)) + " ");       // false
System.out.println(hello == ("Hel" + lo).intern());    // true
于 2013-08-23T21:53:22.083 に答える
0

string4 += "y";新しいオブジェクトを作成します。

ただし、文字列リテラルは、最適化としてメモリ内の同じ場所に配置されます (これはstring interningと呼ばれます)。

于 2013-08-23T21:52:02.433 に答える
0

string1string2、およびstring3はすべて文字列定数です。つまり、それらは.classファイル内の定数プール エントリとして表示されます。Java では、文字列定数はインターンされます。

string4は、文字列定数を取得して"he"から を追加することによって作成された新しい文字列"y"です。したがって、これは文字列定数ではなく、インターンされません。

それが理由string3 != string4です。

于 2013-08-23T21:52:02.760 に答える