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

如何在Java中接收用户输入的两个列表并找出其中的公共元素?

Java中找出两个列表公共元素的实现方案

下面是几种实用的实现方式,覆盖不同场景需求:

方法一:利用集合retainAll()方法

这是最简洁的原生方案,直接借助Java集合框架的交集方法。注意retainAll()会修改原集合,因此建议先创建列表副本再操作。

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

public class CommonElementsFinder {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7));

        // 创建list1的副本,避免修改原列表
        List<Integer> commonElements = new ArrayList<>(list1);
        commonElements.retainAll(list2);

        System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5]
    }
}

说明:如果列表包含重复元素,该方法会保留与原列表一致的重复次数(比如list1是[2,2,3]、list2是[2,4],结果为[2,2])。

方法二:哈希集合优化遍历

当列表数据量较大时,List.contains()的O(n)查询会导致O(n²)的时间复杂度,改用HashSet的O(1)查询可大幅提升效率。

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

public class CommonElementsFinder {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7));

        Set<Integer> set1 = new HashSet<>(list1);
        List<Integer> commonElements = new ArrayList<>();

        for (Integer num : list2) {
            if (set1.contains(num)) {
                commonElements.add(num);
                // 可选:若无需保留重复公共元素,添加后移除避免重复匹配
                // set1.remove(num);
            }
        }

        System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5]
    }
}

方法三:Stream API实现(Java 8+)

用Stream的过滤操作简化代码,适合Java 8及以上版本,同样可结合哈希集合优化性能。

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

public class CommonElementsFinder {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7));

        // 优化版:先转HashSet提升过滤效率
        Set<Integer> set2 = new HashSet<>(list2);
        List<Integer> commonElements = list1.stream()
                .filter(set2::contains)
                .collect(Collectors.toList());

        System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5]
    }
}

方法四:精确匹配重复元素的交集

如果需要严格匹配元素的重复次数(比如list1有2个2、list2有3个2,结果保留2个2),可通过Map统计元素出现次数实现。

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

public class CommonElementsFinder {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>(List.of(2, 2, 3, 3, 3));
        List<Integer> list2 = new ArrayList<>(List.of(2, 2, 2, 3, 4));

        // 统计list1中各元素的出现次数
        Map<Integer, Integer> countMap = new HashMap<>();
        for (Integer num : list1) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        List<Integer> commonElements = new ArrayList<>();
        for (Integer num : list2) {
            if (countMap.containsKey(num) && countMap.get(num) > 0) {
                commonElements.add(num);
                countMap.put(num, countMap.get(num) - 1);
            }
        }

        System.out.println("公共元素:" + commonElements); // 输出 [2, 2, 3]
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:35:56