比较对象,相同内容,不同的id(在eclipse调试器中)

时间:2012-07-03 07:57:16

标签: java compare equals hashcode

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

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

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

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

具有不同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)   

2 个答案:

答案 0 :(得分: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");
    }
}

打印你好。

那你做什么?

答案 1 :(得分:1)

您可以简单地使用ArrayList超类的equals() implementation: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来比较相等性,请参阅此帖子:Is Java hashCode() method a reliable measure of object equality?