You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除List中的重复元素?附示例代码及预期输出

嘿,这个需求很明确——要彻底删掉所有重复出现过的元素,只留那些独一无二的,对吧?我给你几个Java里实用的解决方案:

方案一:HashMap统计次数后过滤

这个方法逻辑直观,容易理解,效率也不错(时间复杂度O(n)),核心是先统计每个元素的出现次数,再筛选出只出现一次的元素:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RemoveDuplicatesCompletely {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(List.of(1, 2, 1, 3, 5));
        Map<Integer, Integer> countMap = new HashMap<>();
        
        // 第一步:遍历列表,统计每个元素的出现次数
        for (Integer num : list) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }
        
        // 第二步:再次遍历原列表,只保留出现次数为1的元素
        List<Integer> result = new ArrayList<>();
        for (Integer num : list) {
            if (countMap.get(num) == 1) {
                result.add(num);
            }
        }
        
        System.out.println(result); // 输出 [2, 3, 5]
    }
}
方案二:Java 8+ Stream API实现

如果你喜欢简洁的代码,Stream API是个好选择。这里要注意保持元素顺序的问题,两种写法供你选:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RemoveDuplicatesWithStream {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(List.of(1, 2, 1, 3, 5));
        
        // 写法1:不保证原顺序(元素会按哈希/自然排序)
        List<Integer> unorderedResult = list.stream()
                .collect(Collectors.groupingBy(num -> num, Collectors.counting()))
                .entrySet().stream()
                .filter(entry -> entry.getValue() == 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
        
        // 写法2:严格保持原列表中的元素顺序
        Map<Integer, Long> countMap = list.stream()
                .collect(Collectors.groupingBy(num -> num, Collectors.counting()));
        List<Integer> orderedResult = list.stream()
                .filter(num -> countMap.get(num) == 1)
                .distinct() // 这里因为唯一元素只会出现一次,其实可以省略,但加上更稳妥
                .collect(Collectors.toList());
        
        System.out.println(orderedResult); // 输出 [2, 3, 5],顺序和原列表完全一致
    }
}
方案三:手动迭代移除(适合小列表场景)

如果你的列表规模很小,也可以用迭代器手动移除重复元素,避免并发修改异常:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class RemoveDuplicatesManually {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(List.of(1, 2, 1, 3, 5));
        List<Integer> result = new ArrayList<>(list);
        
        Iterator<Integer> iterator = result.iterator();
        while (iterator.hasNext()) {
            Integer num = iterator.next();
            // 统计当前元素在原列表中的出现次数
            int count = 0;
            for (Integer n : list) {
                if (n.equals(num)) {
                    count++;
                }
            }
            // 出现次数大于1则移除
            if (count > 1) {
                iterator.remove();
            }
        }
        
        System.out.println(result); // 输出 [2, 3, 5]
    }
}

小总结

  • 追求效率选方案一,只需要两次遍历,性能最优;
  • 喜欢简洁代码选方案二,Stream写法更优雅;
  • 小列表场景可以用方案三,无需额外集合类,逻辑简单。

内容的提问来源于stack exchange,提问作者Yagami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:28:51