当前位置:首页 > Java > 正文

Java去重方法全解析(从基础到高级:小白也能轻松掌握Java集合去重技巧)

在日常的Java开发中,我们经常会遇到需要对数据进行去重的场景。比如用户列表、商品ID、日志记录等,重复的数据不仅浪费内存,还可能影响业务逻辑。本文将手把手教你如何使用Java去重方法,无论你是刚入门的新手,还是有一定经验的开发者,都能从中受益。

Java去重方法全解析(从基础到高级:小白也能轻松掌握Java集合去重技巧) Java去重方法 Java集合去重 ArrayList去重 Java Stream去重 第1张

一、为什么需要去重?

想象一下,你有一个包含1000个用户手机号的列表,但其中有不少重复号码。如果你直接发送短信,可能会多次打扰同一个用户。这时候,使用Java集合去重就显得尤为重要。

二、使用Set实现简单去重

最简单的去重方式是利用 Set 接口的特性——它不允许重复元素。我们可以将 List 转换为 HashSet,再转回 List

import java.util.*;public class DeduplicationExample {    public static void main(String[] args) {        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");                // 使用HashSet去重        Set<String> set = new HashSet<>(list);        List<String> uniqueList = new ArrayList<>(set);                System.out.println(uniqueList); // 输出顺序可能不固定    }}

⚠️ 注意:这种方式会丢失原始顺序。如果你需要保持元素插入顺序,可以使用 LinkedHashSet

三、使用Java 8 Stream去重(推荐)

Java 8 引入了强大的 Stream API,配合 distinct() 方法,可以非常优雅地实现去重,并且保留原始顺序。这是目前最常用的Java Stream去重方式。

import java.util.*;import java.util.stream.Collectors;public class StreamDeduplication {    public static void main(String[] args) {        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");                List<String> uniqueList = list.stream()                                      .distinct()                                      .collect(Collectors.toList());                System.out.println(uniqueList); // [apple, banana, orange]    }}

四、对自定义对象去重

如果列表中存储的是自定义对象(如 User),默认的 distinct() 是基于 equals()hashCode() 判断是否重复的。因此,你需要在类中正确重写这两个方法。

class User {    private String name;    private int id;        public User(String name, int id) {        this.name = name;        this.id = id;    }        @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        User user = (User) o;        return id == user.id;    }        @Override    public int hashCode() {        return Objects.hash(id);    }        @Override    public String toString() {        return "User{" + "name='" + name + "', id=" + id + '}';    }}// 使用List<User> users = Arrays.asList(    new User("Alice", 1),    new User("Bob", 2),    new User("Alice", 1));List<User> uniqueUsers = users.stream().distinct().collect(Collectors.toList());

五、按指定字段去重(高级技巧)

有时你只想根据对象的某个字段(如 name)去重,而不是整个对象。这时可以借助 Collectors.toMap() 或自定义收集器。

// 按 name 字段去重List<User> uniqueByName = users.stream()    .collect(Collectors.toMap(        User::getName,         user -> user,         (existing, replacement) -> existing,         LinkedHashMap::new))    .values()    .stream()    .collect(Collectors.toList());

六、总结

本文详细介绍了多种 Java去重方法,包括:

  • 使用 HashSet / LinkedHashSet 实现基础去重
  • 使用 Stream.distinct() 优雅去重(保留顺序)
  • 对自定义对象正确重写 equalshashCode
  • 按指定字段去重的高级技巧

掌握这些方法后,无论是处理 ArrayList去重 还是复杂对象去重,你都能游刃有余。建议在实际项目中优先使用 Java Stream去重,代码简洁且可读性强。

希望这篇教程对你有所帮助!如果你觉得有用,欢迎分享给更多正在学习Java的朋友。