首页 > 解决方案 > 关于 java 中 set 的问题,Set 如何区分重复元素?

问题描述

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

标签: javaarrayslistsethashset

解决方案


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


推荐阅读