1
String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));

これは以下を出力します:


なぜそうなのか、誰か説明してもらえますか?

4

2 に答える 2

3
String s="abc"; // goes to string constants pool
String s4 = s +"" ;// has value "abc" but goes on heap and not in string constants pool
System.out.println(s4==s);//well,, the references are not equal. There are 2 diffrent instances with value="abc"
System.out.println(s4.equals(s)); // equals() checks for value and the values of both insatnces are equal.
于 2015-03-12T08:30:12.983 に答える
1

コメントに出力を含むコードは次のとおりです-

String s="abc";
String s4 = s +"" ;
System.out.println(s4==s); //false
System.out.println(s4.equals(s)); //true  

最初の 1 つは、 と の参照をチェックしているためfalseです。これら 2 つの参照は異なるため、 と評価されました。ここで(等価) 演算子は、参照型に適用されると、2 つの参照が同じか異なるかをチェックするために使用されます。 s4sfalse==

equals()オブジェクトクラスからの参照型ごとに実現されるメソッドです。独自のクラスの equals() メソッドをオーバーライドできます。

このequals(s)メソッドは、2 つのオブジェクトが意味的に等しいかどうかをチェックするために使用されます。Stringクラスの意味で等しいということは、比較する 2 つの文字列が同じであることを意味しますが、それらの参照は異なる可能性があります。Stringクラスはすでにequals()メソッドをオーバーライドしているため、自分でメソッドをオーバーライドする必要はありませんequals()

文字列プールの概念を理解するために、次のコード スニペットを検討してください。

String s5 = s;
System.out.println(s5); //abc
System.out.println(s5==s); //true
System.out.println(s5.equals(s)); //true

ここでs5==sは true と評価されます。s5新しい String オブジェクトを参照していないためです。プール内の既存の String オブジェクト (つまり、"abc" によって参照されるs) を参照していstringます。s5これで、との両方s4が等しくなります。最後のステートメントでは、s5 と s は意味のある意味で等しいため、s5.equals(s)に評価されtrueます。

それが役立つことを願っています。
どうもありがとう。

于 2015-03-12T07:21:56.783 に答える