比较两个列表

发布于 2024-09-02 23:05:03 字数 91 浏览 2 评论 0原文

我想比较两个列表。由于我们使用 List 编写接口,因此它不会从 Object 类继承 equals 。我该怎么做?

I want to compare two lists. Since we code to interface using List, which does not inherit the equals from from the Object class. How do I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

金兰素衣 2024-09-09 23:05:03

即使 List 接口不包含 equals 方法,列表类可能(并且确实)仍然实现 equals 方法。

来自 AbstractList 上的 API 文档(例如 ArrayListLinkedListVector 继承):

public boolean equals(Object o)

比较指定对象与此列表是否相等。当且仅当指定的对象也是一个列表,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等时,返回 true。

这同样适用于例如 toStringhashCode 方法等。


正如 @Pascal 在评论中提到的,List 接口提到了 equals 方法并在文档中声明了以下内容:

除了 Collection 接口中指定的规定之外,List 接口还对迭代器、add、remove、equals 和 hashCode 方法的契约做出了额外的规定。

Even though the List interface does not contain an equals method, the list-classes may (and does) still implement the equals method.

From the API docs on AbstractList (inherited by for instance ArrayList, LinkedList, Vector):

public boolean 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.

The same applies to for instance the toString, hashCode method and so on.


As @Pascal mentions in the comments, the List interface mentions the equals method and states the following in the documentation:

The List interface places additional stipulations, beyond those specified in the Collection interface, on the contracts of the iterator, add, remove, equals, and hashCode methods.

与君绝 2024-09-09 23:05:03

这是通常的故事:你必须考虑“浅等于”和“深等于”。

从 java.lang.Object 获得的默认行为是“浅等于”。它将检查 list1 和 list2 是否是相同的引用:

List list1 = new ArrayList();
List list2 = list1;

list1.equals(list2); // returns true;

如果您想要“深度等于”,请实例化任何扩展 AbstractList 的内容,例如 ArrayList。

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();

list1.add("hello");
list2.add("hello");
System.out.println(list1.equals(list2)); // will print true

list1.add("foo");
list2.add("bar");
System.out.println(list1.equals(list2)); // will print false

It's the usual story: you have to consider "shallow equals" and "deep equals".

The default behavior that you get out of java.lang.Object is "shallow equals". It'll check to see if list1 and list2 are the same references:

List list1 = new ArrayList();
List list2 = list1;

list1.equals(list2); // returns true;

If you want "deep equals", instantiate anything that extends AbstractList, such as ArrayList.

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();

list1.add("hello");
list2.add("hello");
System.out.println(list1.equals(list2)); // will print true

list1.add("foo");
list2.add("bar");
System.out.println(list1.equals(list2)); // will print false
匿名。 2024-09-09 23:05:03

您仍然可以使用等于。所有对象都实现它,并且您的列表仍然是对象,并根据需要覆盖equals

You can still use equals. All objects implement it, and your lists are still objects and override equals as you need it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文