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

Java中基于id键合并两个集合的最快实现及优化方案

优化方案

核心思路是通过预先构建id到对应数据的索引映射,将嵌套循环的匹配逻辑转换为哈希表O(1)复杂度的查找,整体时间复杂度降至O(N)级别。

实现代码

import java.util.stream.Collectors;
import java.util.Map;
import java.util.Set;

// 第一步:将datas按id分组,构建id到对应Data集合的映射
Map<String, Set<Data>> idToDataMap = datas.stream()
        .collect(Collectors.groupingBy(
                Data::getId,
                Collectors.toSet()
        ));

// 第二步:遍历pers集合,直接从映射中取对应id的Data批量添加
for (Person per : pers) {
    Set<Data> matchedData = idToDataMap.get(per.getId());
    if (matchedData != null) {
        per.getData().addAll(matchedData);
    }
}

注:上述代码中Map的key类型默认使用String,可根据实际业务中id的返回类型自行调整

方案说明

  • 时间复杂度:构建映射需要遍历一次datas,复杂度为O(M)(M为datas集合大小),遍历pers集合的复杂度为O(N)(N为pers集合大小),整体复杂度为O(M+N),属于线性O(N)级别,远优于原O(N*M)的嵌套循环实现。
  • 去重逻辑:per.getData()本身是HashSet实现,addAll方法会自动去重,同时分组时用Collectors.toSet()也提前对同id的Data做了去重,减少冗余添加操作。
  • 兼容性:所用Stream API和Collectors都是Java 8及以上版本原生支持,完全适配Java 11运行环境。

内存优化技巧

  • 优先选择元素数量更少的集合构建映射:如果pers的元素数量比datas少,可以反过来构建id到Person对象的映射,遍历datas逐个添加到对应Person的Data集合中,进一步降低哈希表的内存占用。
  • 临时映射回收:映射使用完后如果不需要保留,可以主动置空idToDataMap = null,方便GC提前回收内存。
  • 若允许修改原始集合逻辑,还可以用HashMap的自定义收集器进一步降低Stream分组的临时内存开销。

内容的提问来源于stack exchange,提问作者Hey StackExchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:15:03