我这段代码为何实现不了去重操作
时间: 2023-07-11 16:49:12 浏览: 85
有趣的代码段实现去重
我看到你的代码如下:
```java
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(1);
HashSet<Integer> set = new HashSet<>(list);
System.out.println(set);
```
这段代码的作用是将一个List中的元素去重后放入HashSet中,并输出HashSet中的元素。但是执行结果却是:
```
[1, 2]
```
set中包含了1和2两个元素,没有去重成功。
这是因为HashSet中的去重是基于对象的hashCode和equals方法实现的。在这里,我们将一个List转换为HashSet时,并没有在List中添加重复的元素,也就是说List中的元素并没有重写hashCode和equals方法,它们的hashCode和equals方法是Object类中的默认实现,因此它们是不同的对象,HashSet会将它们视为不同的元素。
如果要实现List中元素的去重,我们需要对元素进行重写hashCode和equals方法。以下是一个示例代码:
```java
class MyInteger {
private int value;
public MyInteger(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MyInteger myInteger = (MyInteger) o;
return value == myInteger.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
@Override
public String toString() {
return String.valueOf(value);
}
}
```
在这里,我们将Integer进行了包装,自定义了一个MyInteger类,并重写了它的hashCode和equals方法。然后我们将List中的元素转换为MyInteger对象,再将MyInteger对象添加到HashSet中。
以下是修改后的代码:
```java
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(1);
HashSet<MyInteger> set = new HashSet<>();
for (int i : list) {
set.add(new MyInteger(i));
}
System.out.println(set);
```
这段代码的执行结果为:
```
[1, 2]
```
可以看到,元素1只出现了一次,成功进行了去重。
阅读全文