-1

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

次のコードを「java XYZ BOY」として実行すると、出力が「無効な型」になります。

public class XYZ 
{
    public static void main(String args[])
    {


        if(args[0]=="BOY")
            System.out.println("He is boy");

        else if(args[0]=="Girl")
            System.out.println("She is girl");

        else
        System.out.println("Invalid type");


    }
}

ただし、を使用するargs[0].equals("BOY")と、目的の出力が得られます。を使用しないと、ここで問題が発生する理由を知りたいString.equals()ですか?

4

3 に答える 3

6

オペレーター==は、2つの変数が、関心のあるものではないまったく同じオブジェクトを参照しているかどうかをテストします。代わりに、2つのString変数が、同じ文字を同じ順序で同じ場合に保持するStringオブジェクトを参照しているかどうかを知りたいと考えています。 、これは何をするかequals(...)、またはケースに関係なく、それは何をするかequalsIgnoreCase(...)です。

すべてのクラスはequals(...)、最終的な親クラスであるObjectからデフォルトのメソッドを取得します。これは、オーバーライドされない場合==、APIに従って、とまったく同じことを行います。

クラスObjectのequalsメソッドは、オブジェクトに対して可能な限り最も識別力のある同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。

多くのクラスでは、このメソッドをオーバーライドして、クラスにとって意味のある独自の同等性テストを使用しています。文字列はそのようなクラスの1つです。Stringがこれを行う方法の詳細については、次のように記載されているAPIを確認してください。

この文字列を指定されたオブジェクトと比較します。結果は、引数がnullでなく、このオブジェクトと同じ文字シーケンスを表すStringオブジェクトである場合にのみtrueになります。

このすべてを言った-重複としてこの質問を閉じるために投票する。

于 2012-09-22T14:24:13.717 に答える
1

== 演算子を使用しているため、「無効な型」が表示されます。== 演算子は、同じ値とその参照を持つ 2 つのオブジェクトが同一であるかどうかを比較するために使用されます。最初の条件では == 演算子を使用していますが、false が返されます。値は同じですが、オブジェクトは同一ではないためです。次の 2 番目の条件では、false を返す BOY==GIRL をチェックしています。したがって、「無効なタイプ」が出力されます。

于 2012-09-22T14:31:58.180 に答える
1

一部のオブジェクトは、内容が同じであれば同じと見なされます。それらについては、.equals(Object)オブジェクトの内容を比較するために使用します。

一部のオブジェクトは、同じインスタンスである場合、同じと見なされます。それらについては、==オブジェクト インスタンスを比較するために使用します。

をオーバーライドすることでオブジェクトのコンテンツ比較を変更できますが、変更するpublic boolean equals(Object)場合は、残りの Java フレームワークが適切に機能するために 3 つの規則に従う必要があることに注意してください。

  1. 再帰: a.equals(a) は true でなければなりません。
  2. 対称: a.equals(b) の場合、b.equals(a) は true でなければなりません。
  3. 推移的: a.equals(b) と b.equals(c) の場合、a.equals(c) は true でなければなりません。

さらに、a.equals(b) が更新され、a または b が更新されない場合、a.equals(b) が true のままになるように、等値演算は一貫している必要があります。

public int hashcode()equals をオーバーライドすると、true が返されるたびに同一の値を返すようにオーバーライドすることで、ハッシュ関連のコレクションのパフォーマンスを向上させることができequals(...)ます。equals(...)また、 false を返す場合、同じ値を返す可能性は非常に低いはずです。「完全な」ハッシュを作成する必要はありません。これは、false が返されたhashcode(...)場合に異なる値を返すことが保証されているハッシュです。これは、すべての Java コレクション ルーチンが との等価性をチェックした後にチェックするためです。equals(...)equals(...)hashcode(...)

于 2012-09-22T14:34:12.820 に答える