Set集合实现数据去重原理
- HashSet:
- HashSet基于哈希表实现。当向HashSet中添加元素时,首先会调用元素的
hashCode()
方法计算哈希码,通过哈希码可以快速定位到该元素在哈希表中的存储位置(桶)。
- 如果该位置没有其他元素,那么直接将元素放入。如果该位置已经有元素,就会调用元素的
equals()
方法与该位置已有的元素进行比较。如果equals()
方法返回true
,说明两个元素相同,不会重复添加;如果equals()
方法返回false
,说明两个元素不同,会以链表(在JDK 8及以后,如果链表长度达到一定阈值会转化为红黑树)的形式将新元素添加到该位置。
- TreeSet:
- TreeSet基于红黑树实现。TreeSet中的元素会按照自然顺序(如果元素实现了
Comparable
接口)或者自定义顺序(如果在构造TreeSet时传入了Comparator
)进行排序。
- 当向TreeSet中添加元素时,会通过比较元素的顺序来判断是否重复。如果新元素与集合中已有的元素比较结果为0(即相等),则不会重复添加;否则,会将新元素插入到合适的位置以维持树的有序性。
使用HashSet对包含重复元素的整数列表进行去重操作代码示例
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class SetDeduplicationExample {
public static void main(String[] args) {
// 创建一个包含重复元素的整数列表
List<Integer> listWithDuplicates = new ArrayList<>();
listWithDuplicates.add(1);
listWithDuplicates.add(2);
listWithDuplicates.add(2);
listWithDuplicates.add(3);
listWithDuplicates.add(1);
// 使用HashSet进行去重
Set<Integer> set = new HashSet<>(listWithDuplicates);
// 将去重后的结果转换回列表(如果需要)
List<Integer> listWithoutDuplicates = new ArrayList<>(set);
// 输出去重后的列表
System.out.println("去重后的列表: " + listWithoutDuplicates);
}
}