Java Collection.equals()

判断集合是否与指定对象相等

定义

boolean equals​(Object o)

参数

参数类型参数名称参数描述
Objecto要判断的对象

返回值

若指定对象与当前集合相等则返回true.

说明

虽然 Collection 接口对 Object.equals() 的常规实现契约没有添加任何规定, 但选择覆盖 Object.equals() 进而 "直接"实现 Collection 接口(也就是没用 Set, List 类)的开发者必须要谨慎. 其实也没有必要这样做, 最简单的做法还是依赖 Object 的实现, 除非实现者可能希望实现一个 "值比较" 来代替默认的 "引用比较". ListSet 接口要求进行这样的值比较.

Object.equals() 方法的一般约定规定 equals() 必须是对等的, 换句话说, 若有 a.equals(b) 则必有 b.equals(a) . List.equals()Set.equals() 的契约声明列表仅用于其他列表, 合集(Set)仅用于其他合集. 因此, 若一个自定义实现 Collection 接口且既没有实现 List 接口也没有实现 Set 接口的类, 当它与 ListSet 比较时总是返回 false. 同理开发者无法写一个类既正确实现 List 接口又正确实现 Set 接口.

注意事项

在上面的是示例中, 有些 IDE/编辑器 可能会对 list1.equals(set) 处的代码直接给出类似如下的警告:

Unlikely argument type for equals(): Set<String> seems to be unrelated to List<String>Java(1201)

示例

判断两个集合是否相等的示例

package com.yi21.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

public class Yi21CollectionEquals {

    public static void main(String[] args) {

        Set<String> set = Set.of("Hello");
        List<String> list1 = List.of("Hello");
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("Hello");

        System.out.println("对象 set 是否是一个集合? " + (set instanceof Collection));
        System.out.println("对象 list1 是否是一个集合? " + (list1 instanceof Collection));
        System.out.println("对象 list2 是否是一个集合? " + (list1 instanceof Collection));
        System.out.println("两个 List 是否相等? " + list1.equals(list2));
        System.out.println("Set 和 List 是否相等? " + list1.equals(set));

    }

}

执行结果为 :

对象 set 是否是一个集合? true
对象 list1 是否是一个集合? true
对象 list2 是否是一个集合? true
两个 List 是否相等? true
Set 和 List 是否相等? false