-2

クラスを作成しましたA。そして、 class の 2 つのオブジェクトを作成しましAた。

A a1=new A(5);
A a2=new A(5);

次に、メソッドを使用してオブジェクトを比較しようとするとequals、 が返されfalseます。

if (a1.equals(a2)) // ->false

同じ場合、次のようなラッパークラスを使用すると

Integer i1=new Integer(5);
Integer i2=new Interger(5);

if (i1.equals(i2)) // ->returns true

なんで?誰でも説明できますか?

4

5 に答える 5

6

equals()クラスでメソッドをオーバーライドする必要がありますA。デフォルトでは、Objectclass から継承された実装、つまり参照を比較するObject#equals()を使用します。つまり、両方のオブジェクトが heap に存在する同じオブジェクトである場合、trueor elseを返しますfalse。オブジェクトの内容が等しいかどうかを確認する必要がある場合equals()は、クラスのメソッドをオーバーライドします。

注:一般に、オーバーライド中にhashCode()をオーバーライドすることをお勧めしequals()ます。

サンプル実装を提供しました:

class A {
 private int value ;
 A(int value) {
     this.value = value;
 }
 @Override
 public boolean equals(Object obj) {
    if(obj==null || !(obj instanceof A)){
        return false;
    }
    return this.value==((A)obj).value; 
 }
 @Override
 public int hashCode() {
     return this.value;
 }
}

整数クラスはすでにこのメソッドInteger#equals()をオーバーライドしています。

このオブジェクトを指定されたオブジェクトと比較します。引数が null ではなく、このオブジェクトと同じ int 値を含む Integer オブジェクトである場合にのみ、結果は true になります。

推奨読書:

  1. Java で equals と hashCode をオーバーライドします
  2. Joshua Bloch - equals をオーバーライドするときは常に hashCode をオーバーライドする
于 2013-07-29T09:53:47.783 に答える
2

これを持っていると、

 Integer i1=new Integer(5);
 Integer i2=new Interger(5);
 if(i1.equals(i2))

戻りtrueます。

クラスは、参照を比較するのではなく、値を比較するメソッドをIntegerオーバーライドするためです。equals

ラッパー クラス Integer の場合、-128 から 127 までのリテラルが同じプールから使用されます。

HEREから取得したこの興味深いものを見つけることができます。答えについては、これを参照してください

    Integer i1 = 127;
    Integer i2 = 127;

    if(i1==i2){
        System.out.println("true"); //prints true
    }else{
        System.out.println("false");
    }

    Integer i3 = 128;
    Integer i4 = 128;

    if(i3==i4){
        System.out.println("true");
    }else{
        System.out.println("false"); //prints false
    }
于 2013-07-29T09:54:58.460 に答える
2

そのためにはequals()、クラスのメソッドをオーバーライドする必要があります。メソッドをオーバーライドA しない場合Object、参照変数が同じオブジェクトを参照しているかどうかをチェックするクラス equals メソッドが使用されます。

Integerクラスでは、メソッドequals()はすでにオーバーライドされており、値をチェックします。

また、オーバーライドするたびにequals()、オーバーライドhashcode()

public class A {

    private int number;

    A(int number){
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + number;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        A other = (A) obj;
        if (number != other.number)
            return false;
        return true;
    }

    public static void main(String[] args) {
        A a1 = new A(5);
        A a2 = new A(5);

        System.out.println(a1.equals(a2));
    }


}

これは出力されtrueます。

なんで?誰でも説明できますか?

Integerクラスでは、メソッドequals()はすでにオーバーライドされており、値をチェックします。

整数#等しい()

equals メソッドの重要性を理解するのに役立つ優れたチュートリアルがJavaGeekで提供されています。

于 2013-07-29T09:53:38.630 に答える
0

これは、インスタンスを呼び出すと、クラスの equals が呼び出され、参照が比較equals()れるためです。AObject

あなたがするなら:

instance1.equals(instance1); //will return true

カスタム equals 実装を提供するには、クラスでequals メソッドをオーバーライドする必要があります。

class A{


   @Override
   public boolean equals(Object obj){
      return equality;
   }

}
于 2013-07-29T09:55:48.130 に答える
0

クラス A の equals() メソッドをオーバーライドする必要があります

例えば

class A{
   int b;
   A(int b){
      this.b = b;
   }
   @Override
   public boolean equals(A a){
      return this.b ===a.b;      
   }

}
于 2013-07-29T09:55:00.627 に答える