0

重複の可能性:
Javaで文字列を比較するにはどうすればよいですか?

私はJavaを初めて使用し、文字列の比較を理解するのに苦労しています。次のシナリオの違いを誰かが説明できますか?

シナリオ1:

String a = "abc";    
String b = "abc";

実行するif(a == b)とtrueが返されます。

シナリオ2:

String a = new String("abc");    
String b = new String("abc");

実行するif(a == b)とfalseが返されます。

違いはなんですか?

4

7 に答える 7

4

==演算子は、メモリ内の2つのオブジェクトの参照を比較します。それらが同じ場所を指している場合は、trueを返します。StringJavaのオブジェクトは不変であるため、scenario1のように文字列を作成すると、新しい文字列は作成されませんでした。2番目の文字列が最初の文字列のメモリ位置を指しているだけです。

ただし、.equals()メソッドは文字列の内容を比較します。文字列の値が同じ場合、このメソッドはtrueを返します。

したがって、一般的には、equals()の代わりにメソッドを使用することをお勧めします==

于 2012-12-27T14:37:02.790 に答える
4

これは、Java文字列定数メモリプールが原因です。同じ値のリテラルが1回保存されます。

String a = "abc";
String b = "abc";
// Now there is 1 string ("abc") and 2 references pointing to it.

String a = new String("abc");
String b = new String("abc");
// Now you have 2 string instances and 2 references.
于 2012-12-27T14:37:57.830 に答える
1

シナリオ1は、コンパイラーの最適化のためにtrueを返します。

一般に、文字列を比較するequals()代わりにを使用する必要があります。==

于 2012-12-27T14:37:55.483 に答える
1

if(str.equals(str2))Javaでは、参照ではなく文字列の実際の値を比較するこのように使用する必要があります。

于 2012-12-27T14:38:42.573 に答える
1

ケース1:

 String a = "abc";
    String b = "abc";
    if(a == b)

この場合、文字列定数プールにキャッシュされるabcため、新しい文字列は作成されません 。それによって作成され文字列を参照するだけで、trueが返され、両方がメモリ内の同じオブジェクトを指します。String b = "abc"; bab

ケース2:

String a = new String("abc");
String b = new String("abc");
and run if(a == b) then it returns false.

ここでは、2つの文字列が作成され、==オペレーターは2つの参照が同じ参照を指しているかどうかをチェックしますが、この場合はそうではないため、falseを返します。

于 2012-12-27T14:39:51.160 に答える
1

その理由は、Stringリテラル"abc"が、そのすべての出現に対してグローバルStringインスタンスに変換されるためです。これは、同じStringインスタンスになるため、確実に"abc" == "abc"。Stringインスタンスは不変であるため、コンパイラがこれを行うことは可能です。ただし、文字列を明示的に割り当てると、それらは2つの異なるインスタンスになり、コンパイラによって暗黙的に作成された文字列インスタンスとは異なりnew String("abc") != new String("abc")ます"abc" != new String("abc")

コンパイラが何をしているのかを理解するためのもう1つの良い例は、次のコードを調べることです。

"abc".contains("a");

リテラルが文字列型のインスタンスのように動作することがわかります。これを利用して、プログラミングエラーを最小限に抑えることができます。

// this is OK and the condition will evaluate to false
String myStringValue = null;
if ("abc".equals(myStringValue)) { // false

一方、このコードはNPEになります。

// this will produce a NPE    
String myStringValue = null;
if (myStringValue.equals("abc")) { // NPE 
于 2012-12-27T14:40:46.397 に答える
1

文字列を作成する2つの方法は次のとおりです。1)String s = "hello"; 文字列リテラルの数=1すなわち「hello」-ヒープ上の文字列オブジェクトの数=0

2)文字列s = new String( "hello"); -文字列リテラルの数=1および文字列オブジェクトの数=1

Javaは「LITERALS」の文字列プールを維持し、オブジェクトはヒープに留まります。

文字列プーリングの利点:1)メモリ使用量の削減*(PermGenSpaceの問題)2)比較の高速化すなわち==比較3)ルックアップの高速化欠点:1)プールの維持のオーバーヘッド

文字列オブジェクトをプールする方法は?文字列に対してIntern()を使用して、文字列をプールに追加します。インターンの欠点:1)いくつかの文字列をインターンし、==で比較するのを忘れて、予期しない結果が生じる可能性があります。

于 2012-12-27T14:50:01.563 に答える