2

Javaのユーザー定義クラスaとbのインスタンスへの2つの参照があることを見てみましょう。a == bであるが、a.equals(b)がfalseを返す状況が発生する可能性はありますか?

4

8 に答える 8

8

もちろん!の実装.equals()は完全にクラス次第なので、次のように書くことができます。

class Foo
    public boolean equals(Object other) {
        return false;
    }
}

どの 2 つのインスタンスを渡すかは問題ではありません。まったく同じインスタンスが 2 回であっても、私は常にそれらが等しくないと言います。

この特別な設定はばかげていますが、同じオブジェクトに対してfalseから 2 回結果を取得できることを示しています。.equals()

ここでは、何起こるべきかではなく、起こり得ることについて話していることに注意してください.equalsオブジェクトがそれ自体と等しくないと主張するメソッドを実装するクラスはありません。信頼できるコードの場合、これは決して起こらないと想定するのが妥当です。

于 2012-07-07T20:17:49.093 に答える
4

はい、equalsばかげたことをするためにオーバーロードするだけです。例えば

class Foo {
    @Override
    boolean equals(Object rhs) { return false; }
}
于 2012-07-07T20:17:39.103 に答える
3

if a == bその後、a.equals(b)真でなければなりません。もしそうなら、そうa.equals(b)かもしれませんa == bが、必ずしもそうとは限りません。

演算子は==、両方が同じオブジェクトを参照しているかどうかをテストするだけです。Whileequalsは、実装したロジックを実行します。最後のものはオーバーライドできます。最初のものは言語の演算子であり、Java ではオーバーライドできません。

参考文献

== 演算子と equals() の違いは何ですか? (hashcode() で ???)

java.lang.Objectドキュメントから:

equals メソッドは、null 以外のオブジェクト参照に対して等価関係を実装します。

  1. これは再帰的です: null 以外の参照値 x に対して、x.equals(x) は true を返す必要があります。
  2. これは対称的です: null 以外の参照値 x および y について、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
  3. これは推移的です: null 以外の参照値 x、y、および z に対して、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。
  4. 一貫性があります。null 以外の参照値 x および y に対して、x.equals(y) の複数の呼び出しは一貫して true を返すか、一貫して false を返します。ただし、オブジェクトの equals 比較で使用される情報が変更されていない場合に限ります。
  5. null 以外の参照値 x の場合、x.equals(null) は false を返す必要があります。
于 2012-07-07T20:24:14.590 に答える
2

他の回答が指摘しているように、これを行うコードを書くことは明らかに可能です。

ただし、equals()関数の暗黙の一般的なコントラクトに違反するため、コード内の論理エラーでもあります。

オブジェクトは常にそれ自体と等しい必要があるため、その場合(a==b)a.equals(b) 常にtrueを返す必要があります。

于 2012-07-07T20:44:03.050 に答える
1

関数をオーバーロード.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));
    }
}
出力
間違い
間違い
于 2012-07-07T20:29:52.213 に答える
0

はい、簡単に:

public class Wrong{
    public boolean equals(Object other) 
    {
    return false;
    }
}

もちろん、これは実装の通常のルールを完全に破っています- Javadocs.equals()を参照してください- しかし、あなたを止めるものは何もありません。

于 2012-07-07T20:17:57.043 に答える
0

メソッドは、通常のメソッドequals以外のカスタム機能を提供するためにオーバーライドできます==Stringsまた、 == メソッドを使用すると true を返さないなどの型もあります。.equalsor .compareTo(0 を返す場合は等しい)を使用する必要があります。

これにより、追加のヘルプが提供されるはずです

于 2012-07-07T20:18:49.577 に答える
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 つの時点でのデータベースからの値、または乱数。あなたの事件が解決することを願っています

于 2012-07-07T20:49:12.883 に答える