1

文字列を追加する状況があります。そして、私は混乱しています..

   public static void foo() {
       String s = "str4";
       String s1 = "str" + s.length();
       System.out.println("(s==s1) = " + (s1 == s));
   }

    public static void bar() {
       String s = "str4";
       String s1 = "str" + "4";
       System.out.println("(s==s1) = " + (s1 == s));
    }

最初のケースでは「false」を返しますが、2番目のケースでは「true」を返します。両方のケースで「str4」オブジェクトがヒープ上に作成されていることを理解しています。したがって、どちらの場合も true を返す必要があります。しかし、そうではありません。なぜそうなのか誰か助けてください。? ありがとう。!

4

4 に答える 4

3

使用する

s1.equals(s)

それ以外の場合は、参照を比較します。

2 番目のケースでは、最適化され、同じ文字列を参照するtrueため、返されます。String s1 = "str" + "4";String s1 = "str4";ss1

于 2013-03-21T06:48:57.613 に答える
0

私自身の理解では:

"str" => 文字列

"4" => 文字列

でも、

s.length() => int

== を使用すると、メモリ ロケーションが比較されます。

最初の例を使用すると、Java は、String + int = String を実行しようとしているため、「s」の場所以外の別のメモリ位置にある別のString を作成します。

2 番目の例は、値が変更されただけで「s」と同じメモリ ロケーションであるため、true を返します。文字列 + 文字列 = 連結された文字列

2 つの文字列の内部に同じ文字が含まれているが、必ずしも同じ場所にあるとは限らないかどうかを比較しようとしているため、s.equals(s1)が最適なソリューションです。

ただし、両方の変数が同じオブジェクトを指しているかどうかをテストしたい場合は、比較が浅いため==を使用する必要があります。

于 2013-03-21T07:11:49.833 に答える
0

これには . equals() を使用する必要があります

.equals() // if you dont want to ignore case

.equalsIgnoreCase() // if you want to ignore case

== 参照を比較します。

2 番目のケースでは、両方の文字列が等しいため、参照も等しくなります。

   String s = "str4";
   String s1 = "str" + "4"; .//finally str4

ここで s1 と s2 の内容は同じです。したがって、それらは同じ参照を持ちます。

于 2013-03-21T06:49:16.907 に答える