【问题标题】:Why does set.contains method work for some objects only?为什么 set.contains 方法只对某些对象有效?
【发布时间】:2020-09-28 22:14:50
【问题描述】:

我正在尝试了解 set.contains 方法的工作原理。我为数组、列表、集合和类类型制作了 4 个不同的集合。但它不适用于数组和类类型。

class MainClass {
    public static void main(String[] args) {
        Set<int[]> arraySet = new HashSet<>();
        Set<List<Integer>> listSet = new HashSet<>();
        Set<Set<Integer>> setSet = new HashSet<>();
        Set<Numbers> numSet = new HashSet<>();

        int[] array1 = {1,2,3};
        int[] array2 = {1,2,3};

        List<Integer> list1 = Arrays.asList(1,2,3);
        List<Integer> list2 = Arrays.asList(1,2,3);

        Set<Integer> set1 = new HashSet<>(Arrays.asList(1,2,3));
        Set<Integer> set2 = new HashSet<>(Arrays.asList(1,2,3));

        Numbers num1 = new Numbers(1,2,3);
        Numbers num2 = new Numbers(1,2,3);

        arraySet.add(array1);
        listSet.add(list1);
        setSet.add(set1);
        numSet.add(num1);

        // false
        System.out.println(arraySet.contains(array2));
        // true
        System.out.println(listSet.contains(list2));
        // true
        System.out.println(setSet.contains(set2));
        // false
        System.out.println(numSet.contains(num2));
    }
}

class Numbers{
    int num1;
    int num2;
    int num3;

    public Numbers(int num1, int num2, int num3){
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }
}

set.contains 仅适用于 Collection 对象的原因是什么?

【问题讨论】:

  • 尝试给 System.out.println(arraySet); System.out.println(listSet); System.out.println(setSet); System.out.println(numSet);在您的系统输出之前。您将了解其中的区别。
  • @HarmandeepSinghKalsi 和 set.contains 方法有关吗?
  • 它和set.contains()方法没有直接关系,但是你可以这样推断,你的理解哪里错了。

标签: java arrays list collections set


【解决方案1】:

对于包含您编写的类的对象的 HashSet,您可以覆盖对象类中的 equals() 和 hashCode() 方法,如果两个不同的对象具有相同的内容,则 Hashset 会将它们视为相等。 您可以使用 IDE 自动生成覆盖方法。

【讨论】:

    【解决方案2】:

    contains() 方法基于 equals() 方法,因此第一个方法仅在第二个已被覆盖的情况下才有效。

    例如,数组不会覆盖equals() 方法。所以,一个数组引用equals另一个数组引用当且仅当都指向内存中的同一个数组对象(array1 == array2),所以contains()对它们不起作用。 p>

    另一方面,ArrayList会覆盖equals() 方法,这样如果两个ArrayLists 都包含相同顺序的相同对象,则它们将是equal (也适用如果包含的对象覆盖equals() 方法)。所以,contains() 对他们有效

    【讨论】:

    • 你也必须覆盖hashCode(),它才能在集合中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2015-05-01
    • 2020-08-10
    相关资源
    最近更新 更多