关于 java 中的集合的问题,集合如何区分重复元素?

Question about set in java, how does Set works to distinct the duplicate elements?

任何人都可以向我解释一下 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?但是不能区分数组?我认为两者都是通过引用传递并且都是对象对吗?

当您向 set<SomeClass> 添加新对象时,它会调用 SomeClass class 上的 equals() 方法。如果它 returns 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<Employee> 的情况下,员工是用户定义的 class。如果我们不在 Employee class 中使用自定义规则定义 equals() 方法,将从 Object class 继承的 equals() 方法将被调用,并且该集合将没有唯一值.