String s=new String("Computer");
if(s=="Computer")
System.out.print("equals A");
if(s.equals("Computer"))
System.out.print("Equal B");
出力はEqual B
さて、なぜ ==
生成しないのですかequals A
何instanceof
ですか?
String s=new String("Computer");
if(s=="Computer")
System.out.print("equals A");
if(s.equals("Computer"))
System.out.print("Equal B");
出力はEqual B
さて、なぜ ==
生成しないのですかequals A
何instanceof
ですか?
==
参照は、のように等しいです。'この正確なオブジェクトは、他のオブジェクトとまったく同じオブジェクトですか?'。
新しいオブジェクトを作成したときs
、それは比較している文字列と同じオブジェクトにはなりません(使用しているJVMによっては、"foo" == "foo"
内部で同じオブジェクトを使用するため、trueになります)。
.equals()
それを(文字列)と呼んだときs
、それが同じオブジェクトであると判断するための独自のロジックを実行しました。文字列の場合、文字ごとに比較します。
instanceof
はまったく別のものであり、オブジェクトが特定のタイプのオブジェクトのインスタンスであるかどうかを示します。たとえば"foo" instanceof String
、trueです。
2つの文字列の値が同じ場合、メソッドequals()
はを返します。演算子は、両方の文字列が同じ基になるオブジェクトを指している場合にのみなりtrue
ます。したがって、メソッドでテストした場合、同じコンテンツを表す2つの文字列が等しいことが保証されます。一方、オペレーターでテストした場合、同じを参照している場合にのみ当てはまります。したがって、常に比較に使用する必要があります。==
true
equals(Object)
==
Object
equals()
String
instanceof
キーワードを使用して、オブジェクトが指定されたタイプであるかどうかをテストできます。例えば、
if(foo instanceof Bar) { // must not pass
}
詳細については、こちらをご覧ください。
これはおそらく別の質問の複製であることに同意しますが、とにかく答えを投げます。
==演算子は、2つのオブジェクトまたは生データ型(intなど)が同一であるかどうかを判別するためのものです。
文字列はオブジェクトであるため、==を使用して2つの文字列を比較しようとすると、オブジェクト自体が同一であるかどうかを確認しようとしますが、そうではありません。「等しいA」の結果を得るには、sをそれ自体と比較する必要があります。
文字列.equals()
と.equalsIgnoreCase()
は、文字列オブジェクトのテキスト値を比較するメソッドです。これは、実行しようとしていることです。
キーワードは、instanceof
オブジェクトのタイプを検出するために使用されます(たとえば、オブジェクトがString型またはInteger型の場合)。
新しいオブジェクトを作成する代わりに、文字列をs = "Computer"として定義した場合は、trueを返します。これは、Javaが文字列リテラルを特別なメモリスペースに格納するため、sと「Computer」文字列が同じメモリ位置を指すためです。instanceofは、左側のオブジェクトが右側で指定されたクラスのタイプである場合にtrueを返す演算子です。
例えば
String s="";
if(s instaceof java.util.String){
......
}
コードの前のビットはtrueを返します。
x instanceof ClassNameは、xがクラスClassNameまたはそのサブクラスのオブジェクトである場合にのみtrueを返します。
x == yは、値型(char、int、floatなど)と参照型(Object、Integer、YourClass、int []、...)で動作が異なります。値型の場合、xとyがまったく同じである場合はtrueを返します。一方、参照型の場合、xとyが同じオブジェクトを表す場合はtrueを返します。値が異なる2つのオブジェクトの場合、結果はfalseになる可能性があります。C ++でのポインターの比較のように、参照型で==を扱うだけです。ポインターを表す整数が等しい場合、つまりポインターが同じオブジェクトを指す場合、結果はtrueになります。つまり、new String( "abc")== new String( "abc")はfalseです。同じ値ですがオブジェクトが異なります。同様に "abc" == new String( "abc")はfalseですが、 "abc" == 「abc」はtrueです。これは、String定数が.classファイルに何度も出現する場合、1つのStringオブジェクトに変換されるためです。
x.equals(y)はデフォルトで(Object.equalsで)x == yと同じように実装されますが、多くのサブクラスがそれをオーバーライドします。たとえば、文字列の場合、x.equals(y)は、それらの文字列が同じ値であるかどうかをチェックします。それらが同じオブジェクトであるかどうかにかかわらず、次のようになります。new String( "abc")。equals(new String( "abc"))はtrueであり、 "abc" .equals( "abc")はtrueです。
ただし、比較するすべての文字列が「インターン」されている場合は、次のようになります。x = x.intern(); y = y.intern()の場合、x==yが機能します。したがって、たとえば "abc" == new String( "abc")。intern()はtrueを返します。