【问题标题】:Question about set in java, how does Set works to distinct the duplicate elements?关于 java 中 set 的问题,Set 如何区分重复元素?
【发布时间】:2020-12-28 09:46:45
【问题描述】:

谁能向我解释一下 Set 在 java 中是如何工作的?代码如下:


             List<Integer> list = new ArrayList<>();
             list.add(1);
             list.add(2);
             list.add(3);
             List<Integer> list1 = new ArrayList<>();
             list1.add(1);
             list1.add(2);
             list1.add(3);
             Set<List<Integer>> set = new HashSet<>();
             set.add(list);
             set.add(list1);
             System.out.println(set);

             int[] arr = new int[3];
             arr[0] = 1;
             arr[1] = 2;
             arr[2] = 3;
             int[] arr1 = new int[3];
             arr1[0] = 1;
             arr1[1] = 2;
             arr1[2] = 3;
             Set<int[]> set1 = new HashSet<>();
             set1.add(arr);
             set1.add(arr1);
             System.out.println(set1);
         
    

输出: [[1, 2, 3]] [[I@7852e922,[I@6d06d69c]

我的问题是 Set 如何区分 ArrayList/List?但不能区分数组吗?我认为两者都是通过引用传递并且都是对象吗?

【问题讨论】:

  • 区别在于他们如何定义hashCode和equals。
  • 补充说明,Java 中的数组不会覆盖 Object.hashCodeObject.equals,因此只考虑完全相同的数组实例与其自身相等。
  • 简明扼要地说:如果!A.equals(B)可以区分A和B

标签: java arrays list set hashset


【解决方案1】:

当您向set&lt;SomeClass&gt; 添加新对象时,它会调用SomeClass 类的equals() 方法。如果它返回 false(即不存在相同的值),则将对象添加到集合中。

https://docs.oracle.com/javase/8/docs/api/java/util/AbstractList.html#equals-java.lang.Object-

// equals() method of AbstractList class is called here because the set is // of List type

Set<List<Integer>> set = new HashSet<>();
             set.add(list);
             set.add(list1); //list.equals(list1) is true at this point
// This is the reason you got unique values

---------------
// whereas when you add a plain array which is just a plain java object, equals() // gets called on Object class which compares by reference
// This is the reason you don't get unique values

Set<int[]> set1 = new HashSet<>();
             set1.add(arr);
             set1.add(arr1);

此外,在Set&lt;Employee&gt; 的情况下,员工是用户定义的类。如果我们没有在 Employee 类中使用自定义规则定义 equals() 方法,则从 Object 类继承的 equals() 方法将被调用,并且该集合将没有唯一值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2014-03-27
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2021-05-22
    • 2012-06-05
    相关资源
    最近更新 更多