gpt4 book ai didi

java - 如何检查两个 ArrayList 是否不同,我不在乎发生了什么变化

转载 作者:IT老高 更新时间:2023-10-28 20:48:56 46 4
gpt4 key购买 nike

如何检查两个 ArrayList 是否彼此不同?我不在乎有什么区别,我只是想知道它们是否不一样。

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

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

我需要在上面实现 equals() 吗?

最佳答案

关于“同一性”的定义

正如 Joachim 所说,对于大多数应用程序, List.equals(Object o) 定义有效:

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null : e1.equals(e2)).) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.

但是,根据您使用它的方式,这可能无法按预期工作。如果您有 List<int[]> ,例如,它不太有效,因为数组继承了 equals来自 Object它将相等定义为引用标识。

    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"

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

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

您还提到列表必须包含具有相同类型的元素。这是另一个示例,其中元素的类型不同,但它们是 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"

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


关于实现 equals

更新后的信息表明 List.equals 只要元素实现 equals 就可以完成这项工作。正确(因为 List<E>.equals 根据上面的 API 文档在非 E.equals 元素上调用 null)。

所以在这种情况下,如果我们有一个 List<Player> ,然后 Player必须@Override equals(Object o)返回 true如果 o instanceof Player在相关字段上,它们都是equals (对于引用类型)或 == (对于基元)。

当然,当你 @Override equals , 你也应该 @Override int hashCode() .勉强可接受的最小值是 return 42; ;稍微好一点的是return name.hashCode(); ;最好使用包含您定义的所有字段的公式 equals .好的IDE可以自动生成equals/hashCode适合你的方法。

另见

  • 有效的 Java 第 2 版
    • 第 8 条:在覆盖 equals 时遵守一般约定
    • 第 9 条:在覆盖等于时始终覆盖哈希码

API 链接

相关问题

开启 equals/hashCode组合:

开启 equals== :

关于java - 如何检查两个 ArrayList 是否不同,我不在乎发生了什么变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989987/

46 4 0