8

以下のコードで == を使用すると、"Equals!" が出力されます。なぜですか? これら 2 つの異なる文字列 a と b が等しい理由を誰か説明できますか?

public class test
{
    public static void main()
    {
        String a = "boy";
        String b = "boy";

        if(a == b)
        {
            System.out.println("Equals!");
        }
        else
        {
            System.out.println("Does not equal!");
        }
    }
}
4

6 に答える 6

10

これはStringインターンによるものです。

Java (JVM) は、Stringメモリを節約するために使用されるリテラルのコレクションを保持します。Stringしたがって、次のようなものを作成するときはいつでも:

String s = "String";

Java は文字列を「インターン」します。ただし、次のように作成する場合String

String s = new String("String");

Java は自動的にインターンしませんString。この方法で文字列を作成した場合、コードは異なる結果を生成します。

Google で簡単に検索Stringすると、インターンに関する優れたリソースがたくさん見つかります。

于 2010-09-07T04:00:43.450 に答える
2

String a = "boy";値 ("boy") を持つ新しい文字列オブジェクトを作成し、それを文字列プールに配置してa参照させます。

インタープリターがを参照すると、最初に が文字列プールに存在するString b = "boy";かどうかを確認します。存在するため、新しいオブジェクトは作成されず、参照しているのと同じオブジェクトを参照するように作成されます。 string "boy"ba

両方の参照に同じ内容が含まれているため、同等性テストに合格します。

于 2010-09-07T04:01:12.887 に答える
2

この記事では、詳細について説明します。

Javaの==とequals()の違いは何ですか?

String a = “boy”; の実行後 JVM は文字列「boy」を文字列プールに追加し、コードの次の行で再び String b = 「boy」に遭遇します。この場合、JVM はこの文字列が既にプールにあることを認識しているため、新しい文字列を作成しません。したがって、文字列 a と b の両方が同じ文字列を指しているということは、それらが同じ参照を指していることを意味します。

于 2010-09-07T03:58:08.553 に答える
1

ランタイムには文字列プールがあり、新しい定数文字列を割り当てる必要がある場合、ランタイムはプール内を調べ、プールに含まれている場合は、変数ポイントをプール内の同じ String オブジェクトに設定します。

ただし、コンテンツ文字列が等しいかどうかを確認するためにこれに依存するべきではありません。次の方法を使用する必要があります。equals

于 2010-09-07T04:00:31.000 に答える
0

上記で正しく説明したように、'=='比較の場合、ランタイムはStringプールに文字列が存在するかどうかを調べます。ただし、ガベージ コレクション中またはメモリの問題中に、仮想マシンが文字列プールを破棄する可能性が非常に高くなります。その"=="ための演算子は、正しい値を返す場合と返さない場合があります。

レッスン - 常にequals()比較のために使用します。

于 2010-09-07T04:07:04.793 に答える
0

以下のような文字列を作成するたびに:

String str1 = "abc";
String str2 = "abc";

JVM はstr2 = "abc"文字列定数プールをチェックし、存在する場合は新しい文字列を作成せず、代わりに文字列定数プール内の文字列を指します。

ただし、この場合、String str = new String("abc");常に新しい文字列オブジェクトが作成されますが、intern()関数を使用して、JVM に文字列定数プールを強制的に調べることができます。

于 2010-09-07T09:15:09.777 に答える