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

为什么我在Apex开发中使用的Map出现数据被覆盖的问题?

问题根因

你的代码核心问题是集合引用复用:
你在遍历Account的循环外提前初始化了accContacts列表,Apex中的集合属于引用类型,你调用accContacts.clear()、add()方法时都是修改同一块内存地址里的内容,每次map.put(ac.Id, accContacts)实际是把同一个列表的引用存到了Map的不同key下。
循环结束后,Map里所有key对应的都是同一个列表对象,内容自然是最后一次循环生成的Contact数据,这就是你看到所有Account都关联同一份Contact的原因。

修复方案

把accContacts的初始化逻辑移到遍历Account的循环内部,每次循环都生成一个全新的独立列表即可:

public static Map<Id, List<Contact>> createContacts(List<Account> accounts, Integer numOfContacts) {
    Map<Id, List<Contact>> mapOfAccountIdToListOfContacts = new Map<Id, List<Contact>>();
    List<Contact> addedContacts = new List<Contact>();

    for(Account ac :accounts) {
        // 每次处理新Account时新建独立的Contact列表,避免引用复用
        List<Contact> accContacts = new List<Contact>();
        for(Integer i=0;i<numOfContacts;i++) {
            Contact newContact = new Contact(
                LastName='TestContact' + i,
                Email = 'TestContact' + i + '@testco.com',
                AccountId = ac.Id
            );
            accContacts.add(newContact);
        }
        mapOfAccountIdToListOfContacts.put(ac.Id, accContacts);
        System.debug('Map.put=' + ac.id + ', ' + accContacts);
        addedContacts.addAll(accContacts);
    }
    insert addedContacts;
    for(Id key :mapOfAccountIdToListOfContacts.keySet()) {
        System.debug('Contacts=' + mapOfAccountIdToListOfContacts.get(key));
    }
    return mapOfAccountIdToListOfContacts;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:39:02