1

これは同じ質問の更新であり、部分的に解決されています。

Java-オブジェクトのプロパティに違いはありません

int size = 0;
int new = 10;
int default = 100;

ClassList filterList = new ClassList();
filterList.setSize(size);
filterList.setNew(new);
filterList.setDefault(default);

//ここで、ClassListの別のインスタンスを作成しています。

ClassList newList = ClassList(); 

newListの値が。であるのは奇妙ですが、インスタンスが同じかどうかを確認しようとしたときにsize, new and default値があります。0, 0 and 0

if(filterList .equals(newList)){
    Log.d("Is it equal","True");
    } else {
    Log.d("Its Not equal","false");
}

私はそれを間違った。

私のPOJOクラスは、ゲッターとセッターを備えた単純なものです。

public class ClassList{

    private int size;
    private int new;
    private int default;

    public int getPageSize() {
        return size;
    }
    public void setPageSize(int size) {
        this.size = size;
    }
}
4

4 に答える 4

2

のデフォルト値intは、新しく作成されたインスタンスに値0がある理由です。size, new and default0, 0 and 0

デフォルトの等しい比較==は、参照の等しい場合に発生します。オーバーライドする必要がありequalsますhashcode

Object#equalsのJavadocから

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

通常、hashCodeメソッドの一般的なコントラクトを維持するために、このメソッドがオーバーライドされるたびにhashCodeメソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています。

サンプル実装:

public static class ClassList {

    private int size;
    private int newValue;
    private int defaultValue;

    public int getPageSize() {
        return size;
    }
    public void setPageSize(int size) {
        this.size = size;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (!(obj instanceof ClassList))
            return false;
        ClassList c = (ClassList) obj;

        return this.size == c.size && this.newValue == c.newValue
                && this.defaultValue == c.defaultValue;
    }

    @Override
    public int hashCode() {
        return Integer.valueOf(size).hashCode()
                + Integer.valueOf(newValue).hashCode()
                + Integer.valueOf(defaultValue).hashCode();
    }
}

注:newおよびdefaultはJavaで予約されているキーワードです。予約キーワードの変数名を定義することはできません。


参照:

于 2012-11-02T11:32:27.817 に答える
1

カスタムイコライジングのオーバーライドequalsとメソッドが必要です 。hashcode

public class ClassList{

    private int size;
    private int new;
    private int default;

    public int getPageSize() {
        return size;
    }
    public void setPageSize(int size) {
        this.size = size;
    }
    public boolean equals(Object obj){
         if (obj == null)
             return false;
         else if (obj == this)
             return true;
         else if (obj.getClass() != getClass())
             return false;
         else
             return this.hashCode()==obj.hashCode();
    }
    public int hashCode(){
       return size+new+default;
    }
}
于 2012-11-02T11:31:20.833 に答える
1

ClassListクラスのequalsメソッドとhashCodeメソッドをオーバーライドします。

これをEclipseで行うには、Javaファイルを右クリックして->ソース-> hashCode()とequals()を生成します。

于 2012-11-02T11:32:08.840 に答える
1

Javaでのオブジェクトの同等性は、デフォルトでのオブジェクトのフィールドの状態によって決定されません。各インスタンスは他のインスタンスとは異なります。

オブジェクトの状態に応じてequalsメソッドを返すには、メソッドをオーバーライドする必要があります。true

equals正しく実装するのは簡単ではないかもしれません。実装のアドバイスについては、 APIドキュメントでequalsメソッドを検索してください 。

于 2012-11-02T11:32:10.567 に答える