Skip to main content

SF-0329 · Compare · Medium

What is the difference between Trigger.New and Trigger.NewMap?

✓ Verified by Vikas Singhal · Last reviewed 5/17/2026 · Updated for Spring '26

Trigger.new and Trigger.newMap hold the same records — just in different shapes. Trigger.new is a List<SObject> (positional, ordered). Trigger.newMap is a Map<Id, SObject> (keyed by record Id, O(1) lookup). The key difference for interviews: newMap is null in before insert, because the records have no Ids yet.

Side-by-side

PropertyTrigger.newTrigger.newMap
TypeList<SObject>Map<Id, SObject>
LookupBy indexBy record Id
Available in before insertYesNo (null) — records have no Id
Available in before updateYesYes
Available in after insertYesYes
Available in after updateYesYes
Available in delete contextsNoNo
Available in after undeleteYesYes
WritableIn before contexts onlyNever (the map view is read-only)

When to reach for which

Use Trigger.new when you’re iterating — collecting Ids, computing fields in place, walking every record once.

for (Account a : Trigger.new) {
    if (a.AnnualRevenue == null) a.AnnualRevenue = 0;
}

Use Trigger.newMap when you need lookup by Id — pairing each new record with its old version, or correlating with related records you queried separately.

trigger CaseTrigger on Case (after update) {
    Set<Id> changedIds = new Set<Id>();
    for (Case c : Trigger.new) {
        if (c.Status != Trigger.oldMap.get(c.Id).Status) changedIds.add(c.Id);
    }
    Map<Id, Case> changed = new Map<Id, Case>();
    for (Id id : changedIds) changed.put(id, Trigger.newMap.get(id));
    AuditService.logStatusChanges(changed);
}

The “construct your own map” idiom

In before insert, you don’t have Trigger.newMap, but sometimes a downstream method expects a map. You can build one from Trigger.new only after the records have Ids — i.e. in any after context:

Map<Id, Account> byId = new Map<Id, Account>(Trigger.new);

The Map<Id, SObject> constructor accepts a List<SObject> and indexes by Id automatically. This is the same data Salesforce hands you as Trigger.newMap, just constructed manually.

Common interview follow-ups

  • Why is Trigger.newMap null in before insert? — Records have no Id field yet, so there’s no key to map by.
  • Is Trigger.newMap available in before delete? — No, both new and newMap are null in any delete context. Use Trigger.old / Trigger.oldMap.
  • Can I modify the records via Trigger.newMap? — In before contexts, yes — newMap.get(id).Field__c = value; works because it returns a reference to the same record Trigger.new holds.

Verified against: Apex Developer Guide — Trigger Context Variables. Last reviewed 2026-05-17.