文章目录
- 前言
- 一、使用Set接口
- 下面是对几种Set实现类的简单介绍及代码示例:
- 1.HashSet:
- 2.LinkedHashSet:
- 3.TreeSet:
- 二、使用Stream API
- 三、其他方式
- 1.使用Collectors.toSet()方法:
- 配合Stream API的collect()方法,可以将元素收集到一个Set中,自动去重。
- 2.使用Apache Commons Collections库的CollectionUtils.removeDuplicates()方法:
- 3.使用Java 8+新特性:
- 4.使用谷歌的Guava库的Sets.newHashSet()方法:
- 四、性能对比
- 总结
前言
在日常的Java开发中,去重是一个常见的操作。对于一个包含重复元素的集合,
我们常常需要去除重复元素,以便进行后续的处理。本文将介绍几种常用的Java去重方式,并进行性能对比。
一、使用Set接口
Set是Java中的一个接口,它的实现类包括HashSet、LinkedHashSet和TreeSet。
由于Set不允许重复元素存在,因此可以通过将数据存储在Set中,自动去除重复元素。
下面是对几种Set实现类的简单介绍及代码示例:
1.HashSet:
使用HashMap实现的Set,不保证元素的顺序,是最快的去重方法。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new HashSet<>(list);
2.LinkedHashSet:
使用LinkedHashMap实现的Set,保证按插入顺序去重。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new LinkedHashSet<>(list);
3.TreeSet:
使用红黑树实现的Set,保证元素有序去重,性能相较HashSet和LinkedHashSet稍慢。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new TreeSet<>(list);
二、使用Stream API
Java 8引入的Stream API提供了便捷的方法链式操作集合元素。
Stream的distinct()方法可以用于去除重复元素。
示例如下:
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
三、其他方式
1.使用Collectors.toSet()方法:
配合Stream API的collect()方法,可以将元素收集到一个Set中,自动去重。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = list.stream()
.collect(Collectors.toSet());
2.使用Apache Commons Collections库的CollectionUtils.removeDuplicates()方法:
可以去除List中的重复元素。
import org.apache.commons.collections4.CollectionUtils;
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
CollectionUtils.removeDuplicates(list);
3.使用Java 8+新特性:
例如使用Stream和filter,根据元素自身的某个属性进行去重,或者使用流的distinct()方法配合自定义的比较器去重。
List<Person> personList = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Alice", 25),
new Person("Charlie", 35)
);
List<Person> distinctList = personList.stream()
.distinct()
.collect(Collectors.toList());
// 自定义比较器去重示例:
List<Person> distinctList = personList.stream()
.filter(
new HashSet<>(
ConcurrentHashMap.newKeySet()
)::add
).collect(Collectors.toList());
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 省略getter和setter方法
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
4.使用谷歌的Guava库的Sets.newHashSet()方法:
将集合转换为HashSet,自动去重。
import com.google.common.collect.Sets;
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = Sets.newHashSet(list);
四、性能对比
在性能方面,HashSet是最快的去重方式,它的底层使用散列表实现。
LinkedHashSet和TreeSet则相对较慢,因为它们维护了元素的插入顺序或者有序性。
使用Stream API的distinct()方法和Collectors.toSet()方法在性能上比较接近,具体取决于集合的大小和元素的重复程度。
根据实际情况选择合适的去重方式,可以提高代码的可读性和性能。
在处理大量数据时,需要根据具体场景进行性能测试和优化,选择适合的数据结构和算法。
总结
本文介绍了Java中几种常用的去重方式,包括使用Set接口、Stream API、Apache Commons Collections库等。根据实际需求和性能考量选择合适的方法,可以提高程序的效率和可维护性,满足各种去重需求。
希望本文能够帮助读者更好地理解Java中去重操作,并在实际开发中得到应用和启发。
(注:以上性能对比结果仅供参考,具体性能表现可能因环境和数据规模等因素有所不同)
@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!