3

我的想法不多了...我正在比较两个对象,它们都有一个自定义类型的数组列表字段。

两个对象都包含数组列表中的一个元素。

当我查看 eclipse 调试器时,它看起来完全一样,直到最接近的细节,除了不同的 id (它看起来像: (id=111) 在调试器中)

有趣的是,这个不同的 ID 在一个整数类型(计数器)的字段上。这显然不应该发生,因为整数已经实现了等于和哈希码,对吧?

另一个具有不同 ID 的字段是字符串类型(过滤器)

具有这些字段的两个对象之间的 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 回答