3

アイデアが不足しています... 2 つのオブジェクトを比較しています。どちらもカス​​タム タイプの配列リスト フィールドを持っています。

どちらのオブジェクトにも、配列リストに 1 つの要素が含まれています。

Eclipseデバッガーを調べると、IDが異なることを除いて、最も詳細に至るまで完全に同じに見えます(デバッガーでは: (id=111) のように見えます)

面白いことに、この異なる ID は、整数型 (カウンター) の 1 つのフィールドにあります。integer には equals と hashcode が既に実装されているため、どちらが明らかに起こるべきではありませんか?

ID が異なるもう 1 つのフィールドは文字列型 (フィルター) です。

これらのフィールドを持つ 2 つのオブジェクト間の equals メソッドは false を返します...理由がわかりません...すべての equals および hashCode メソッドは、すべてのカスタム型に実装されています..

これはEclipseデバッガーからのものです:

オブジェクト 1:

Object (id=159)
arrayList ArrayList<E>  (id=175)
   [0]  Item  (id=175)      
      counter Integer  (id=179) 
      filter    "abcd" (id=181) 
            count   4
            hash    -717152022  
            offset  2   
            value    (id=189)   

オブジェクト 2:

Object (id=259)
arrayList ArrayList<E>  (id=267)
   [0]  Item  (id=268)      
      counter  Integer  (id=268)    
      filter    "abcd" (id=269) 
            count   4
            hash    -717152022  
            offset  2   
            value    (id=270)   
4

2 に答える 2

1

ArrayListsをどのように比較しますか?いくつかのコードを投稿してください。

public static void main(String[] args) {
    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();

    list1.add("abcd");
    list2.add("abcd");

    if (list1.equals(list2)) {
        System.out.println("hello");
    }
}

こんにちはを印刷します。

それで、あなたは何をしますか?

于 2012-07-03T08:20:22.473 に答える
1

ArrayList スーパークラスのequals() 実装を単純に使用できます: AbstractList。

equals()クラスでメソッドをオーバーライドした場合のみItem

例えば ​​:

@Override
public boolean equals(Item item){
    if(this.counter.equals(item.counter) 
          && this.filter.equals(item.filter)){
         // && etc for all Item fields that make the equality
        return true;
    }
    return false;
}

また、同等性を比較するために hashCode に依存することはできないことに注意してください。次の記事を参照してください: Java hashCode() メソッドはオブジェクトの同等性の信頼できる測定値ですか?

于 2012-07-03T10:27:06.237 に答える