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

面试题:不使用distinct()通过Java Stream查找整数List重复元素

问题说明

面试中遇到的Java技术题要求:在不调用Java Stream的distinct()方法的前提下,查找存储Integer类型元素的List中的重复元素,实现过程必须使用Java Stream API,全程禁止调用distinct()方法。
题目给出的初始桩代码:

List<Integer> listOfInt = new ArrayList<>();
实现思路

核心可以利用两种不依赖distinct()的去重判断逻辑实现:

  • 利用Set集合元素不重复的原生特性,通过Set.add()的返回值判断元素是否重复
  • 利用Stream的分组收集器统计每个元素的出现频次,筛选频次大于1的元素即为重复值
方案1:基于Set判断实现(性能最优)

Set.add()方法在插入已存在元素时会返回false,插入新元素返回true,可以直接作为过滤条件筛选重复元素,代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class DuplicateFinder {
    public static void main(String[] args) {
        List<Integer> listOfInt = new ArrayList<>();
        // 补充测试数据
        listOfInt.add(1);
        listOfInt.add(2);
        listOfInt.add(3);
        listOfInt.add(2);
        listOfInt.add(3);
        listOfInt.add(3);
        listOfInt.add(4);

        Set<Integer> visited = new HashSet<>();
        List<Integer> duplicates = listOfInt.stream()
                // 已存在的元素add返回false,取反后命中filter,判定为重复
                .filter(num -> !visited.add(num))
                // 这一步是为了避免同一重复值多次出现在结果中,比如3重复2次,结果只保留一个3
                .collect(Collectors.toSet())
                .stream()
                .collect(Collectors.toList());

        System.out.println(duplicates); // 输出结果 [2, 3]
    }
}

如果需求是要列出所有重复位置的元素(即同一重复值出现几次就返回几次),可以去掉转Set的步骤,直接filter后收集到List即可。

方案2:基于分组统计实现(无外部变量)

如果不想引入外部Set变量,可以用groupingBy收集器统计每个元素的出现次数,再筛选重复值,全程纯Stream链式操作:

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

public class DuplicateFinder {
    public static void main(String[] args) {
        List<Integer> listOfInt = new ArrayList<>();
        // 补充测试数据
        listOfInt.add(1);
        listOfInt.add(2);
        listOfInt.add(3);
        listOfInt.add(2);
        listOfInt.add(3);
        listOfInt.add(3);
        listOfInt.add(4);

        List<Integer> duplicates = listOfInt.stream()
                // 按元素值分组,统计每个值的出现次数
                .collect(Collectors.groupingBy(num -> num, Collectors.counting()))
                .entrySet()
                .stream()
                // 筛选出现次数大于1的元素
                .filter(entry -> entry.getValue() > 1)
                .map(entry -> entry.getKey())
                .collect(Collectors.toList());

        System.out.println(duplicates); // 输出结果 [2, 3]
    }
}
方案对比
  • 方案1时间复杂度O(n),遍历一次列表即可完成筛选,性能更高,适合数据量较大的场景
  • 方案2时间复杂度同样为O(n),没有外部副作用变量,逻辑更直观,还可以同时拿到元素的重复次数,适合需要额外统计信息的场景
  • 两种方案均未调用distinct()方法,完全符合题目要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:21:27