Javaのユーザー定義クラスaとbのインスタンスへの2つの参照があることを見てみましょう。a == bであるが、a.equals(b)がfalseを返す状況が発生する可能性はありますか?
8 に答える
もちろん!の実装.equals()
は完全にクラス次第なので、次のように書くことができます。
class Foo
public boolean equals(Object other) {
return false;
}
}
どの 2 つのインスタンスを渡すかは問題ではありません。まったく同じインスタンスが 2 回であっても、私は常にそれらが等しくないと言います。
この特別な設定はばかげていますが、同じオブジェクトに対してfalse
から 2 回結果を取得できることを示しています。.equals()
ここでは、何が起こるべきかではなく、起こり得ることについて話していることに注意してください。.equals
オブジェクトがそれ自体と等しくないと主張するメソッドを実装するクラスはありません。信頼できるコードの場合、これは決して起こらないと想定するのが妥当です。
はい、equals
ばかげたことをするためにオーバーロードするだけです。例えば
class Foo {
@Override
boolean equals(Object rhs) { return false; }
}
if a == b
その後、a.equals(b)
真でなければなりません。もしそうなら、そうa.equals(b)
かもしれませんa == b
が、必ずしもそうとは限りません。
演算子は==
、両方が同じオブジェクトを参照しているかどうかをテストするだけです。Whileequals
は、実装したロジックを実行します。最後のものはオーバーライドできます。最初のものは言語の演算子であり、Java ではオーバーライドできません。
参考文献
== 演算子と equals() の違いは何ですか? (hashcode() で ???)
java.lang.Object
ドキュメントから:
equals メソッドは、null 以外のオブジェクト参照に対して等価関係を実装します。
- これは再帰的です: null 以外の参照値 x に対して、x.equals(x) は true を返す必要があります。
- これは対称的です: null 以外の参照値 x および y について、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
- これは推移的です: null 以外の参照値 x、y、および z に対して、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。
- 一貫性があります。null 以外の参照値 x および y に対して、x.equals(y) の複数の呼び出しは一貫して true を返すか、一貫して false を返します。ただし、オブジェクトの equals 比較で使用される情報が変更されていない場合に限ります。
- null 以外の参照値 x の場合、x.equals(null) は false を返す必要があります。
他の回答が指摘しているように、これを行うコードを書くことは明らかに可能です。
ただし、equals()関数の暗黙の一般的なコントラクトに違反するため、コード内の論理エラーでもあります。
オブジェクトは常にそれ自体と等しい必要があるため、その場合(a==b)
はa.equals(b)
常にtrueを返す必要があります。
関数をオーバーロード.equals
して、目的の出力を得ることができます。==
ただし、 true を返し、false を返す場合はありません.equals
。
class s {
int a;
}
class dev {
public static void main(String args[]) {
s a = new s();
s b = new s();
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
出力 間違い 間違い
はい、簡単に:
public class Wrong{
public boolean equals(Object other)
{
return false;
}
}
もちろん、これは実装の通常のルールを完全に破っています- Javadocs.equals()
を参照してください- しかし、あなたを止めるものは何もありません。
メソッドは、通常のメソッドequals
以外のカスタム機能を提供するためにオーバーライドできます==
。Strings
また、 == メソッドを使用すると true を返さないなどの型もあります。.equals
or .compareTo
(0 を返す場合は等しい)を使用する必要があります。
これにより、追加のヘルプが提供されるはずです
package com.stackOverFlow;
import java.util.Date;
public class SampleClass {
public static int myint = 1;
private SampleClass() {
};
public Integer returnRandom() {
return myint++;
}
private static SampleClass _sampleClass;
public static SampleClass getInstance() {
if (_sampleClass == null) {
_sampleClass = new SampleClass();
}
return _sampleClass;
}
@Override
public boolean equals(Object other) {
if (this.returnRandom().equals(((SampleClass) other).returnRandom())) {
return true;
}
return false;
}
}
package com.stackOverFlow;
public class Run {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SampleClass a = SampleClass.getInstance();
SampleClass b = SampleClass.getInstance();
if(a==b){
System.out.println("references are same as they are pointing to same object");
if(!a.equals(b)){
System.out.println("two random number Instance will never be same");
}
}
}
}
これは、実際の例で理解できます。シングルトンクラスは常に同じ参照を返します.equalsメソッドをオーバーライドして、クラス変数ではないものを取得できます. たとえば、特定の 2 つの時点でのデータベースからの値、または乱数。あなたの事件が解決することを願っています