Java中找出两个List中相同元素的方法

在Java编程中,我们经常需要处理集合数据,比如List。有时,我们需要找出两个List中相同的元素。本文将介绍几种在Java中实现这一功能的方法,并提供相应的代码示例。

1. 使用HashSet

HashSet是一个不允许重复元素的集合,我们可以利用这个特性来找出两个List中的相同元素。

1.1 代码示例

import java.util.*;

public class FindCommonElements {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

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

        commonElements.retainAll(set1);

        System.out.println("相同的元素有: " + commonElements);
    }
}

1.2 序列图

sequenceDiagram
    participant L1 as List1
    participant L2 as List2
    participant S1 as Set1
    participant CE as CommonElements

    L1->>S1: 转换为HashSet
    L2->>CE: 转换为HashSet
    CE->>S1: 保留与S1相同的元素
    CE->>CE: 输出结果

2. 使用Streams API

Java 8引入了Streams API,它提供了一种声明式的方式来处理集合数据。

2.1 代码示例

import java.util.*;
import java.util.stream.Collectors;

public class FindCommonElementsWithStreams {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

        Set<Integer> commonElements = list1.stream()
                .filter(list2::contains)
                .collect(Collectors.toSet());

        System.out.println("相同的元素有: " + commonElements);
    }
}

2.2 序列图

sequenceDiagram
    participant L1 as List1
    participant L2 as List2
    participant S as Stream
    participant CE as CommonElements

    L1->>S: 转换为Stream
    S->>L2: 过滤包含的元素
    S->>CE: 收集结果
    CE->>CE: 输出结果

3. 使用HashMap

HashMap可以用来存储List中的元素及其出现次数,然后比较两个HashMap中的键。

3.1 代码示例

import java.util.*;

public class FindCommonElementsWithHashMap {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

        Map<Integer, Integer> map1 = new HashMap<>();
        list1.forEach(e -> map1.merge(e, 1, Integer::sum));

        Map<Integer, Integer> map2 = new HashMap<>();
        list2.forEach(e -> map2.merge(e, 1, Integer::sum));

        Set<Integer> commonElements = new HashSet<>(map1.keySet());
        commonElements.retainAll(map2.keySet());

        System.out.println("相同的元素有: " + commonElements);
    }
}

3.2 序列图

sequenceDiagram
    participant L1 as List1
    participant L2 as List2
    participant M1 as Map1
    participant M2 as Map2
    participant CE as CommonElements

    L1->>M1: 转换为HashMap
    L2->>M2: 转换为HashMap
    M1->>CE: 获取键集合
    M2->>CE: 获取键集合
    CE->>CE: 保留相同的键
    CE->>CE: 输出结果

4. 甘特图

为了更好地理解这些方法的执行过程,我们可以使用甘特图来表示。

gantt
    title 找出两个List中相同元素的方法
    dateFormat  YYYY-MM-DD
    section 使用HashSet
    转换List为Set    :done,    des1, 2023-04-01,2023-04-02
    找出相同元素   :active,  des2, after des1, 3d
    输出