String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));
これは以下を出力します:
偽
真
なぜそうなのか、誰か説明してもらえますか?
String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));
これは以下を出力します:
偽
真
なぜそうなのか、誰か説明してもらえますか?
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.
コメントに出力を含むコードは次のとおりです-
String s="abc";
String s4 = s +"" ;
System.out.println(s4==s); //false
System.out.println(s4.equals(s)); //true
最初の 1 つは、 と の参照をチェックしているためfalse
です。これら 2 つの参照は異なるため、 と評価されました。ここで(等価) 演算子は、参照型に適用されると、2 つの参照が同じか異なるかをチェックするために使用されます。 s4
s
false
==
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
ます。
それが役立つことを願っています。
どうもありがとう。