首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >阿里字节技术大佬都在用的List集合去重方案!

阿里字节技术大佬都在用的List集合去重方案!

作者头像
JavaEdge
修改2025-12-15 16:57:32
修改2025-12-15 16:57:32
3410
举报
文章被收录于专栏:JavaEdgeJavaEdge

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

1 常规去重

除了遍历去重,常想到用Set集合不允许重复元素特点,List和Set互转去重。

代码语言:java
复制
// 遍历后判断赋给另一个List集合,保持原来顺序
public static void ridRepeat1(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    for (String str : list) {
        if (!listNew.contains(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set集合去重,保持原来顺序
public static void ridRepeat2(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    Set set = new HashSet();
    for (String str : list) {
        if (set.add(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set去重     由于Set(HashSet)的无序性,不会保持原来顺序
public static void ridRepeat3(List<String> list) {
    System.out.println("list = [" + list + "]");
    Set set = new HashSet();
    List<String> listNew = new ArrayList<String>();
    set.addAll(list);
    listNew.addAll(set);
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过HashSet去重(将ridRepeat3方法缩减为一行) 无序
public static void ridRepeat4(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new HashSet(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过TreeSet去重   会按字典顺序重排序
public static void ridRepeat5(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过LinkedHashSet去重  保持原来顺序
public static void ridRepeat6(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new LinkedHashSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

stream去重

代码语言:java
复制
List uniqueList = list.stream().distinct().collect(Collectors.toList());
System.out.println(uniqueList.toString());

上述方法在List元素为基本数据类型及String类型时可,但若List集合元素为对象,却失效!

代码语言:java
复制
List<User> userList = new ArrayList<>();
userList.add(new User(name: "小黄", age: 10));
userList.add(new User(name: "小红", age: 23));
userList.add(new User(name: "小黄", age: 78));
userList.add(new User(name: "小黄", age: 10));

// 使用HashSet,无序
Set<User> userSet = new HashSet<>(userList);
System.out.println(userSet);

// 使用LinkedHashSet,有序
List<User> listNew = new ArrayList<>(new LinkedHashSet<>(userList));
System.out.println(listNew.toString());

[User(name=小黄, age=78), User(name=小黄, age=10), User(name=小红, age=23)]
[User(name=小黄, age=10), User(name=小红, age=23), User(name=小黄, age=78)]

User 类必须正确重写 equals()hashCode() 方法,否则无法正确去重。

2 对象去重

可用for循环遍历判断去重。

2.1 stream去重

代码语言:java
复制
// name属性去重
List<User> uniqueNameList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(User::getName))), ArrayList::new)
        );

System.out.println("根据name去重后集合元素:" + uniqueNameList.toString());

// name,age属性去重
List<User> uniqueNameAndAgeList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(o -> o.getName() + ";" + o.getAge()))), ArrayList::new)
        );

System.out.println("根据name,age去重后集合元素:" + uniqueNameAndAgeList.toString());

输出结果:

代码语言:java
复制
源集合元素:[User(name=张三, age=78), User(name=李四, age=23), User(name=张三, age=10)]
有序集合元素:[User(name=张三, age=10), User(name=李四, age=23), User(name=张三, age=78)]
根据name去重后集合元素:[User(name=张三, age=10), User(name=李四, age=23)]
根据name,age去重后集合元素:[User(name=张三, age=10), User(name=张三, age=78), User(name=李四, age=23)]

重写equals()、hashCode()

代码语言:java
复制
@Override
public boolean equals(Object obj) {
    User user = (User) obj;
    return name.equals(user.getName()) && (age==user.getAge());
}

@Override
public int hashCode() {
    String str = name + age;
    return str.hashCode();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 常规去重
    • stream去重
  • 2 对象去重
    • 2.1 stream去重
    • 重写equals()、hashCode()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档