0

なぜこれは間違っているのですか?

String str1 = new String("Java    ");
String str2 = str1;
System.out.println(str1.trim()==str2.trim());  //false

最初はオブジェクトstr2を参照していました。str1したがって、== と比較すると true が返されます。str1==str2

では、なぜメソッドでこれがfalseになるのでしょうか?.trim()

リテラルの場合でも false を返します( new キーワードなし)

String str1 = "Java    ";  //this is now without new keyword
String str2 = str1;
System.out.println(str1.trim()==str2.trim());

注:メソッドの使用方法は知っています.equals==しかし、特に上記の 2 つの例で .trim() の場合の動作を知りたいです。

4

11 に答える 11

4

equals()またはメソッドを使用equalsIgnoreCase()して文字列を比較します。==オブジェクトの同一性を比較します。

于 2013-04-15T08:02:25.003 に答える
4

== の代わりに equal を使用

System.out.println(str1.equals(str2.trim()));
于 2013-04-15T08:02:37.297 に答える
4

文字列は Java では不変です。また、文字列リテラルはインターンされます。つまり、Java は文字列リテラルのプールを維持します。

最初の 2 行で 1 つのオブジェクトを作成し、2 つの参照で str1 と str2 を同じオブジェクトに参照しています。

trim() が文字列に適用されると、新しい文字列オブジェクトが形成され、現在の参照が新しいオブジェクトに割り当てられます。しかし、オブジェクトの作成 str1.trim() と str2.trim() の間に new が使用されるため、どちらも 2 つの別個のオブジェクトを作成することになります。

参照: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim%28%29

trim() メソッドは新しいオブジェクトを作成します。同じオブジェクト (複数の参照 str1 および str2 によって参照されますが) に個別に trim() を適用したため、2 つの新しいオブジェクトが作成されます。これが、参照の等価性が機能しない理由です。

于 2013-04-15T08:09:21.220 に答える
2

文字列は == ではなく等号で比較されます

于 2013-04-15T08:02:26.677 に答える
1

文字列の内容を比較したい場合は、 が必要.equealsです。

あなたの(変更された)例

String str1 = new String("Java    ");
String str2 = str1;
System.out.println(str1.trim().equals(str2.trim()));  //is now true
于 2013-04-15T08:02:46.780 に答える
1

文字列の比較には、str1.equals(str2)orを使用する必要がありますstr1.equalsIgnoreCase(str2)

その他のポイントについては、この質問を確認してください。

于 2013-04-15T08:03:05.297 に答える
1

"=="

refrence 関数で動作しtrim、新しい refrence を持つ新しいオブジェクトを作成します。それが常にfalseを返す理由です

于 2013-04-15T08:22:37.563 に答える
1

使用しているため、演算子は使用String str1=new String("Java "); できません==

を使用した場合はString str1="Java ";、使用できます==

したがって、ここでコードを次のように変更しますString str1="Java ";

または変更

System.out.println(str1.trim().equals(str2.trim())); 
于 2013-04-15T08:05:23.127 に答える
0

== は、オブジェクトの内容をチェックせずに両方のオブジェクトが同じかどうかをチェックするため、トウ オブジェクトの参照が同じかどうかを比較します。string はオブジェクトであるため、== は文字列の内容をチェックせずに、string 型の同じ Object でのみ機能します。文字列使用の内容を確認するには

  equals() or equalsIgnoreCase
于 2013-04-15T08:05:46.043 に答える