13

重複の可能性:
Java での文字列比較と文字列インターン

Javaで次のコードを実行しようとしています:

if("hello".trim() == "hello".trim())
   System.out.println("Equal");
else
   System.out.println("Not Equal");

そしてそれは等しいと印刷します。この場合、両方の文字列が同じ参照を持っていることを理解しています。しかし、両方の文字列にスペースを追加するだけで同じことを試みると、「等しくない」と出力されます。

if("hello ".trim() == "hello ".trim())
   System.out.println("Equal");
else
  System.out.println("Not Equal");

「等しくない」と表示される理由を誰か説明できますか...?

4

4 に答える 4

16

の実装を確認するだけでtrim、それは明らかです。文字列の先頭/末尾に空白がないと判断した場合trimは、同じ文字列を返します。これが最初のケースです。2 番目のケースでは、新しい文字列が作成されるため、それぞれが独自の ID を持つ 2 つの等しい String インスタンスが作成されます。そして、お気づきだと思いますが、演算子 == はオブジェクトではなく参照を比較するため、2 つのインスタンスが等しい文字列を表しているかどうかは気にしません。

于 2012-09-30T10:00:31.660 に答える
6

この動作は、 (bold mine)のJavaDoc で説明されています。trim()

先頭と末尾の空白が削除されたこの文字列のコピー、または先頭または末尾の空白がない場合はこの文字列

実装からも明らかです。

public String trim() {
    //...
    return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

先頭または末尾の空白が見つかった場合は、 substring()new を返すと呼ばれStringます。thisそれ以外の場合は返されます。

興味深い事実: どちらの場合も (thisが返された場合substring()と が呼び出された場合)、返されるオブジェクトは同じ元のchar[]配列を指します。ラッピングStringオブジェクトのみが変更され、配列インデックスはその配列のサブセットを選択します。

于 2012-09-30T10:04:28.230 に答える
3
if("hello".trim() == "hello".trim())

ここでは、文字列は実際には変更されていません..一方、2番目のケースでは: -

if("hello ".trim() == "hello ".trim())

文字列を変更しています..そして、両方の文字列が異なるオブジェクトを作成します..

ただし、メソッドを使用してそれらを比較しようとするとequals()、希望どおりの結果が得られます..equals()メソッドは2つの文字列の内容を比較しますが==、参照を比較します..

そのため、同じ内容の文字列の 2 つの異なるオブジェクトを を使用して==比較すると、実際にreferenceはこれらの文字列の を比較していることになります。

于 2012-09-30T10:01:28.180 に答える
1

ドキュメントから -トリム:

「この String オブジェクトが空の文字シーケンスを表す場合、またはこの String オブジェクトによって表される文字シーケンスの最初と最後の文字の両方が '\u0020' (スペース文字) より大きいコードを持つ場合、この String オブジェクトへの参照が返されます。 "

(最初の例の場合、同じ参照が得られます)

「それ以外の場合、コードが '\u0020' より大きい文字列の最初の文字のインデックスを k とし、コードが '\u0020' より大きい文字列の最後の文字のインデックスを m とする。インデックス k の文字で始まり、インデックス m の文字で終わるこの文字列の部分文字列を表す文字列オブジェクトが作成されます。つまり、this.substring(k, m+1) の結果です。

(したがって、2 つの新しい文字列が作成されます。メモリ内の 2 つのオブジェクトが異なるため、決定は false を返します)

今後の参考のために、これを行うことができます: if ("hello ".trim().equals("hello ".trim()))2 つの文字列の内容が等しいかどうかを確認します。

于 2012-09-30T10:06:51.827 に答える