如何移除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
相关产品推荐
相关产品推荐

