如何检查两个ArrayList是否不同,我不在乎改变了什么

ufk*_*ufk 37 java arraylist

如何检查两个ArrayLists是否彼此不同?我不在乎有什么不同,我只是想知道他们是不是一样.

我每分钟从数据库中获取分数列表,并且只有当我获取的分数列表与我在一分钟前获取的分数列表不同时,我才想将其发送给客户端.

现在,ArrayList的值实际上是我创建的一个类(包含name,lvl,rank,score).

我需要实施equals()吗?

pol*_*nts 79

关于"同一性"的定义

正如约阿希姆所指出的,对于大多数应用,List.equals(Object o)定义工作:

将指定对象与此列表进行比较以获得相等性.返回true当且仅当该指定的对象也是一个列表,两个列表具有相同的大小,并且在两个列表元素的所有相应的对是相等的.(两个元素e1,e2如果相等则相等(e1==null ? e2==null : e1.equals(e2)).)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等.此定义确保该equals方法在List接口的不同实现中正常工作.

但是,根据您使用它的方式,这可能无法按预期工作.List<int[]>例如,如果你有一个,它就不会很有效,因为数组继承equalsObject它,它将相等性定义为引用标识.

    List<int[]> list1 = Arrays.asList(new int[] { 1, 2, 3 });
    List<int[]> list2 = Arrays.asList(new int[] { 1, 2, 3 });
    System.out.println(list1.equals(list2)); // prints "false"
Run Code Online (Sandbox Code Playgroud)

此外,具有不同类型参数的两个列表可以是equals:

    List<Number> list1 = new ArrayList<Number>();
    List<String> list2 = new ArrayList<String>();
    System.out.println(list1.equals(list2)); // prints "true"
Run Code Online (Sandbox Code Playgroud)

您还提到该列表必须包含具有相同类型的元素.这是另一个示例,其中元素的类型不同,但它们是equals:

    List<Object> list1 = new ArrayList<Object>();
    List<Object> list2 = new ArrayList<Object>();
    list1.add(new ArrayList<Integer>());
    list2.add(new LinkedList<String>());
    System.out.println(list1.equals(list2)); // prints "true"
Run Code Online (Sandbox Code Playgroud)

因此,除非您明确定义平等对您意味着什么,否则问题可能会有非常不同的答案.但是,对于大多数实际目的来说,List.equals应该足够了.


实施 equals

更新后的信息表明List.equals,只要元素equals正确实现(因为根据上面的API文档List<E>.equals调用E.equalsnull元素),就能很好地完成工作.

所以在这种情况下,如果我们有a List<Player>,那么Player必须@Override equals(Object o)返回trueif o instanceof Player和on相关字段,它们都是equals(对于引用类型)或==(对于基元).

当然,当你@Override equals,你也应该@Override int hashCode().几乎不可接受的最低限度是return 42;; 稍好一点就是return name.hashCode();; 最好是使用涉及您定义的所有字段的公式equals.一个好的IDE可以自动equals/hashCode为您生成方法.

也可以看看

  • 有效的Java第二版
    • 第8项:在超越平等时遵守总合同
    • 第9项:覆盖equals时始终覆盖hashcode

API链接

相关问题

equals/hashCode组合:

equalsvs ==:


Joa*_*uer 12

使用equals().只要列表中的元素equals()正确实现,它就会返回正确的值.

除非您想忽略值的顺序,否则您应该将值转储到两个Set对象中并比较使用的值equals().

  • 如果将值放在一个集合中,则删除重复项......只有当它们包含相同的元素时,才会检查它们是否相同.这可能是也可能不是OP想要的.但在我看来,如果一个列表包含3个x而一个只包含2个,则它们不相同. (2认同)
  • @Lizzan:那也行不通.列表["a","a","b"]和["a","b","b"]具有相同的长度,如果转换为集合则相等,但对于任何合理的仍然不相等列表相等的定义. (2认同)

Tra*_*man 9

这是一个简单的方法,可以检查2个数组列表是否包含相同的值,无论它们的顺序如何.

 //the name of the method explains it well...
    public boolean isTwoArrayListsWithSameValues(ArrayList<Object> list1, ArrayList<Object> list2)
    {
        //null checking
        if(list1==null && list2==null)
            return true;
        if((list1 == null && list2 != null) || (list1 != null && list2 == null))
            return false;

        if(list1.size()!=list2.size())
            return false;
        for(Object itemList1: list1)
        {
            if(!list2.contains(itemList1))
                return false;
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)