理解Collection接口的contains()方法

理解Collection接口的contains()方法:

直接上代码:
定义一个User类:

class User {
    int id;
    String name;

    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

定义一个Cat类:

class Cat {
    int age;
    String type;

    public Cat() {
    }
    public Cat(int age, String type) {
        this.age = age;
        this.type = type;
    }

    // 重写了equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cat cat = (Cat) o;
        return age == cat.age && Objects.equals(type, cat.type);
    }
}

测试程序:

public class Test03 {
    public static void main(String[] args) {
        // 创建集合对象ArrayList
        Collection c = new ArrayList();

        // 添加元素
        User u1 = new User(1001, "张三");
        c.add(u1);

        Cat c1 = new Cat(3, "波斯猫");
        c.add(c1);
        System.out.println(c.size());  // 2

        User u2 = new User(1001, "张三");
        System.out.println(c.contains(u2));  // false

        Cat c2 = new Cat(3, "波斯猫");
        System.out.println(c.contains(c2));  // true

        // 通样是调用contains()方法,为什么结果就不一样?
        // 再仔细观察User类和Cat类,发现User类没有重写equals()方法,Cat类重写了equals()方法
        // 同样也可以翻阅ArrayList的contains()的源代码,发现底层调用了equals()方法进行判断
        // 结论:放在集合里面的元素,它的类一定要重写equals()方法。
    }
}

结论:

contains(Object obj)方法是判断一个集合是否包含某个指定对象。

contains()方法的源代码中调用了equals()方法进行判断是否包含。

所以存放在集合里的元素,它的类一定要重写equals()方法。


你可能感兴趣的:(JavaSE)