java - 关于 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?但不能区分数组吗?我认为两者都是通过引用传递并且都是对象吗?
解决方案
当您将新对象添加到 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
推荐阅读
- r - Plotly plot doesn't show up when using shiny
- continuous-integration - Bitbucket pull-request:需要来自不同存储库的绿色构建
- android - Android addTextChangedListener 不进入子方法
- sql - 如何使用来自另一个表的坐标但通过特定 ID 更新 PostGIS 中现有表(带点)的位置?
- docker - How do I specify the dockerfile stage in Visual Studio Code Remote?
- python-docx - 无法更改样式“标题 1”的 font.name
- ios - 如何在 UIStackView 内排列的子视图上设置自定义高度?
- python - 如何约束 Windows 的 Python 启动器?
- swift - 如何在php和swift中发送HTTP post请求和json获取值
- macos - 有没有办法在 OSX 中获取活动窗口的信息?