Java 中求两个 List集合的交集元素

在 Java 中,求两个 List 的交集元素可以通过多种方式实现。常见的做法包括使用 retainAll 方法、Stream API 或手动遍历。以下是这些方法的原理和实现:

1. 使用 retainAll 方法

retainAllCollection 接口中的一个方法,用于保留集合中与指定集合相同的元素,移除其他元素。

原理:
  • retainAll 方法会遍历当前集合,并检查每个元素是否存在于指定集合中。
  • 如果元素不存在于指定集合中,则从当前集合中移除该元素。
  • 最终,当前集合只保留与指定集合相同的元素。

retainAll 是 Java 中 List 接口提供的一个方法,用于保留列表中与指定集合中相同的元素,移除其他所有元素。换句话说,retainAll 方法会修改当前列表,使其仅包含与指定集合中相同的元素。


方法定义
boolean retainAll(Collection<?> c);
参数:
  • c:包含需要保留元素的集合。
返回值:
  • 如果列表因调用此方法而发生变化,则返回 true
  • 如果列表未发生变化(即列表已经只包含指定集合中的元素),则返回 false

方法行为
  1. 保留交集retainAll 方法会保留当前列表与指定集合的交集。
  2. 移除其他元素:当前列表中不在指定集合中的元素会被移除。
  3. 修改原列表retainAll 方法会直接修改当前列表,而不是返回一个新的列表。

示例代码

以下是一个简单的示例,展示 retainAll 方法的使用:

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

public class RetainAllExample {
   
   
    public static void main(String[] args) {
   
   
        // 创建两个列表
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");
        list1.add("Date");

        List<String> list2 = new ArrayList
Java 中,计算两个集合交集可以通过多种方式实现,具体选择决于性能需、代码可读性以及是否使用第三方库。以下是几种常见的实现方式: ### 方法一:使用 `retainAll()` 方法 `retainAll()` 是 Java 集合框架中 `Collection` 接口提供的方法,可以直接修改调用该方法的集合,使其仅保留与指定集合共有的元素。 ```java Set<Integer> primeNumbers = new HashSet<>(Arrays.asList(2, 3, 5, 7)); Set<Integer> evenNumbers = new HashSet<>(Arrays.asList(2, 4, 6, 8)); primeNumbers.retainAll(evenNumbers); // primeNumbers 现在仅包含交集元素 [2] ``` 此方法适用于 `Set` 类型的集合,但需要注意的是,它会修改原始集合的内容[^2]。 --- ### 方法二:使用 `HashMap` 实现高效查找 通过将一个集合元素存储在 `HashMap` 中,可以实现对另一个集合的快速查找,从而找出交集元素。这种方法通常比双重循环更高效,尤其是在数据量较大时。 ```java public List<Object> intersectionForList_3(List<Object> arr1, List<Object> arr2) { List<Object> resultList = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); arr1.forEach(a1 -> map.put(a1.toString(), a1)); arr2.forEach(a2 -> { Object obj = map.get(a2.toString()); if (obj != null) { resultList.add(obj); } }); return resultList; } ``` 该方法的时间复杂度为 O(n + m),其中 n 和 m 分别是两个集合的大小,适用于较大数据量的集合处理[^1]。 --- ### 方法三:使用 Apache Commons Collections 的 `CollectionUtils.intersection()` 如果项目中引入了 Apache Commons Collections 库,可以使用 `CollectionUtils.intersection()` 方法,该方法返回两个集合交集,并保持原始集合不变。 ```java List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 5, 6, 7, 8)); List<Integer> intersection = CollectionUtils.intersection(list1, list2); ``` 此方法提供了简洁的 API,适用于需要维护代码可读性和可维护性的项目[^3]。 --- ### 方法四:使用 Java 8 的并行流(Parallel Streams) Java 8 引入了流(Stream)API,可以利用 `filter()` 和 `contains()` 结合并行流来计算交集。 ```java List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); List<Integer> intersection = list1.parallelStream() .filter(list2::contains) .collect(Collectors.toList()); ``` 这种方式利用了多核处理器的优势,适用于大数据集的并行处理,但需要注意线程安全和资源消耗问题。 --- ### 方法五:手动遍历(嵌套循环) 虽然效率较低,但在小数据量或教学示例中仍可使用: ```java List<Integer> intersection = new ArrayList<>(); for (Integer item : list1) { if (list2.contains(item)) { intersection.add(item); } } ``` 这种方法的时间复杂度为 O(n * m),不适用于大规模数据处理[^4]。 --- ### 总结 - **`retainAll()`**:适合修改原始集合的场景,效率高。 - **`HashMap`**:查找效率高,适用于大数据量。 - **Apache Commons Collections**:简洁易用,适合引入第三方库的项目。 - **Java 8 并行流**:适合大数据集,利用并行计算提高性能。 - **嵌套循环**:适合小数据集或教学用途。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值