在Java开发中,处理数据去重是常见需求,无论是从数据库查询结果、集合对象还是JSON数据中去除重复字段,都需要选择合适的方法,本文将系统介绍Java中去除重复字段的多种实现方式,涵盖基础集合操作、Stream流处理、对象去重及JSON数据处理等场景,帮助开发者根据实际需求选择最优方案。

使用Set集合自动去重
对于基础数据类型或字符串的重复去除,Java的Set集合是最直接的工具,由于Set接口的实现类(如HashSet、TreeSet)不允许存储重复元素,只需将待去重的数据存入Set集合即可自动完成去重,去除List中的重复字符串:
List<String> list = Arrays.asList("a", "b", "a", "c", "b");
Set<String> set = new HashSet<>(list);
List<String> result = new ArrayList<>(set); // 结果为["a", "b", "c"]
此方法利用了HashSet基于哈希表的特性,时间复杂度接近O(n),适合简单数据类型的去重,若需保持原有顺序,可使用LinkedHashSet,它在HashSet基础上维护了插入顺序。
Stream流式处理去重
Java 8引入的Stream API为去重操作提供了更灵活的语法,通过distinct()方法可轻松对流中的元素去重,支持自定义去重逻辑。
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
对于对象去重,可通过Collectors.toMap()或Collectors.groupingBy()结合自定义键实现,根据对象的某个字段(如id)去重:

List<User> users = Arrays.asList(new User(1, "Alice"), new User(2, "Bob"), new User(1, "Alice"));
List<User> distinctUsers = users.stream()
.collect(Collectors.toMap(
User::getId, // 去重依据的字段
user -> user,
(existing, replacement) -> existing // 重复时保留第一个
))
.values()
.stream()
.collect(Collectors.toList());
这种方式通过指定字段作为键,确保对象列表中该字段值唯一,同时支持保留重复项中的第一个或最后一个。
使用Guava工具库
Google Guava库提供了更强大的集合操作工具,其Sets.newHashSet()或Lists.newArrayList(Sets.newHashSet(list))可快速实现去重,Guava的Multimap或Table结构也能处理复杂去重场景。
List<String> list = Arrays.asList("x", "y", "x", "z");
List<String> distinctList = Lists.newArrayList(Sets.newHashSet(list));
Guava的优势在于代码简洁性,且性能经过优化,适合大型项目中的批量数据处理。
JSON数据去重
在处理JSON对象数组时,通常需根据特定字段去重,以Jackson库为例,可先将JSON转为List对象,再通过Stream去重:

ObjectMapper mapper = new ObjectMapper();
List<Person> persons = mapper.readValue(jsonString, new TypeReference<List<Person>>() {});
List<Person> distinctPersons = persons.stream()
.collect(Collectors.toMap(
Person::getPhone, // 假设以手机号去重
p -> p,
(p1, p2) -> p1
))
.values()
.stream()
.collect(Collectors.toList());
若需直接操作JSON字符串,可使用JSONArray的distinct()方法(需依赖第三方库如json-lib),或通过遍历+Map实现手动去重。
注意事项
- 对象去重需重写equals()和hashCode():若使用HashSet或HashMap去重对象,必须正确重写
equals()和hashCode()方法,否则去重逻辑会失效。 - 线程安全:若在多线程环境下操作,需使用线程安全的集合(如
ConcurrentHashMap)或加锁处理。 - 性能权衡:对于超大数据量,Stream的并行流(
parallelStream())可提升处理速度,但需注意线程安全和资源消耗。
通过以上方法,开发者可根据数据类型、去重字段及性能要求选择合适的去重策略,确保代码高效且可维护。

















