关于 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()
方法将被调用,并且该集合将没有唯一值.
任何人都可以向我解释一下 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()
方法将被调用,并且该集合将没有唯一值.