Java ArrayLists即使它们不相等也不相同

时间:2013-08-08 04:23:47

标签: java arraylist

您好我有两个ArrayList,其中存有HashMap。例如

expectedList = [
{
    id = 1, key = X, rowid = 1, id = 1, timeofday = 12: 12: 00,
    stream = A
},
{
    id = 999999999, key = Y, rowid = 2, id = 1, timeofday = 16: 12: 00,
    stream = A
}]

tableList = [
{
    id = 1, key = X, rowid = 1, id = 1, timeofday = 12: 12: 00,
    stream = A
},
{
    id = 999999999, key = Y, rowid = 2, id = 1, timeofday = 16: 12: 00,
    stream = A
}]

expectedFileList.equals(tableList) //返回false知道为什么?两个列表中的数据完全相同,即使顺序相同,它仍返回false。请指导。提前谢谢。

6 个答案:

答案 0 :(得分:4)

两件事:

  1. tableList中的最后一个元素表示bundlestream=...,而expectedList只表示stream=...。有些东西显然不同。 编辑:OP似乎编辑了这个变化;所以它一定是一个错字,离开:

  2. 您确定列表中存储的对象是否正确实现了equals()(或者,在这种情况下,列表中的HashMaps中的键和值)?如果这些对象的equals()没有返回预期的结果,那么ArrayList的equals()也不会。(/ p>

  3. 临时编辑:

    @OP:你能运行以下代码:

    public static <T,U> void dumpList (List<HashMap<T,U>> list) {
        System.out.println("List:");
        for (HashMap<T,U> map:list)
            for (Map.Entry<T,U> e:map.entrySet())
                System.out.println(e.getKey().getClass() + ", " + e.getValue().getClass());
    }
    

    在两个列表中,例如:

    dumpList(tableList);
    dumpList(expectedList);
    

    并在你的问题中发布它打印的输出?

答案 1 :(得分:1)

数据不同

stream=A
vs
bundlestream=A

答案 2 :(得分:0)

你的tableList有bundlestream = A

答案 3 :(得分:0)

问题是数据的最后一个对象是不同的。

stream=Abundlestream=A

答案 4 :(得分:0)

equals()的{​​{1}}继承自ArrayList

AbstractList
  

将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回true,两个列表   具有相同的大小,以及两者中所有相应的元素对   清单是平等的。 (如果(e1 == null,两个元素e1和e2相等)?   e2 == null:e1.equals(e2))。)换句话说,定义了两个列表   如果它们包含相同顺序的相同元素,则相等。

所以,也许你还没有覆盖public boolean equals(Object o) 中至少一个对象的.equals()

答案 5 :(得分:0)

首先,您必须了解equals在ArrayList中的工作原理。 此外,您还在数组中存储了HashMap。 这是equals方法在ArrayList

中的工作方式
public boolean equals(Object paramObject)
    {
        if (paramObject == this)
            return true;
        if (!(paramObject instanceof List))
        {
            return false;
        }
        ListIterator localListIterator1 = listIterator();
        ListIterator localListIterator2 = ((List) paramObject).listIterator();
        while ((localListIterator1.hasNext()) && (localListIterator2.hasNext()))
        {
            Object localObject1 = localListIterator1.next();
            Object localObject2 = localListIterator2.next();
            if (localObject1 == null)
                if (localObject2 != null)
                    ;
                else if (!(localObject1.equals(localObject2)))
                    return false;
        }
        return ((!(localListIterator1.hasNext())) && (!(localListIterator2.hasNext())));
    }

是的,ArrayList在内部比较List中的每个和evertObject,再次通过ArrayList中的元素equals方法进行比较。 在您的情况下,元素是HashMap,因此U还需要知道equals方法在HashMap中的工作原理。 http://javarevisited.blogspot.in/2011/02/how-hashmap-works-in-java.html 因此,排序和快速解决方案就是您自己的equals方法。并且不要忘记也实现hasCode方法。 How to return index of ArrayList<Field> 对不起,答案很长。