5

標準ループを使用して、次のように部分文字列を文字列値と比較しました。

if (str.substring(i, i+3) == "dog" ) dogcount++;

そしてそれは反復を破りました。最初のインクリメントの後、「犬」のそれ以上のインスタンスは検出されません。

だから私はsubstring.equalsを使用しましたが、それはうまくいきました:

if (str.substring(i, i+3).equals("dog")) dogcount++;

私の質問は、なぜですか?理解を深めたいだけです、thx。

4

5 に答える 5

10

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

s1 == s2両方の文字列がメモリ内の同じオブジェクトを指している場合、true を返します。これはよくある初心者の間違いであり、通常は望んでいるものではありません。

s1.equals(s2)両方の文字列が物理的に等しい(つまり、同じ文字を含む)場合に true を返します。

于 2012-05-25T18:17:25.840 に答える
8

==参照を比較します。代わりに使用して値を比較しますequals()

于 2012-05-25T18:16:40.813 に答える
4

==文字列の参照(文字列の格納場所)を比較します

.equals()文字列の値を比較します

于 2012-05-25T18:17:12.297 に答える
4

比較のためStringに、常にequals()メソッドを使用してください。比較する==と参照が比較されるためです。

さらなる知識へのリンクはこちらです。

とメソッドの違いをよりよく理解するために、コード例とともにこれを読むこともできます。==equals()

于 2012-05-25T18:17:48.623 に答える
3

「文字列」はJavaのオブジェクトであるため、「==」は前述のように参照を比較します。ただし、次のようなコード

String str1 = "dog";
String str2 = "dog";
if(str1==str2)
    System.out.println("Equal!");

実際には "Equal!" が出力され、混乱する可能性があります。その理由は、リテラルをオブジェクトに直接割り当てると、JVM がコードを少し最適化しString、str1 と str2 が実際に同じオブジェクトを参照し、JVM 内の内部プールに格納されるためです。一方、コード

String str1 = new String("dog");
String str2 = new String("dog");
if(str1==str2)
    System.out.println("Equal!");

2 つの新しいオブジェクトが必要であると明示的に述べているため、何も出力されません。
複雑さや予期しないエラーを回避したい場合は、文字列で「==」を使用しないでください。

于 2012-05-25T18:24:40.987 に答える