본문 바로가기
삵

putIfAbsent와 computeIfAbsent 차이

조회 0 · 댓글 0
OOOooOOoo작성자2026년 10월 22일

Map<K, List<V>> 같은 누적 맵을 만들 때 둘을 헷갈리기 쉽습니다. 공식 문서 기준으로 동작이 다릅니다. putIfAbsent(key, value)는 value를 미리 계산해서 넘기므로, 키가 이미 있어도 그 value 객체는 항상 생성됩니다. 키가 없거나 null이면 넣고 null을 반환, 있으면 기존 값을 반환합니다. computeIfAbsent(key, mappingFunction)는 키가 없을 때만 함수를 호출하는 지연 평가라, 불필요한 객체 생성을 피합니다. 반환값도 다릅니다. 키가 없으면 새로 계산한 값을, 있으면 기존 값을 돌려줍니다.

그래서 리스트 누적 패턴에서는 computeIfAbsent가 맞습니다. 아래처럼 쓰면 한 줄로 끝납니다.

// 매 호출마다 new ArrayList 생성 후 버려짐 (낭비)
map.putIfAbsent(key, new ArrayList<>());
map.get(key).add(v);

// 키가 없을 때만 리스트 생성, 그 리스트를 바로 반환
map.computeIfAbsent(key, k -> new ArrayList<>()).add(v);

주의할 점 하나. computeIfAbsent의 mappingFunction이 null을 반환하면 아무것도 저장되지 않고 null을 반환합니다. 값으로 null을 넣을 의도가 아니라면 함수가 null을 돌려주지 않게 해야 합니다.

🔗 https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Map.html

로그인 후 답글을 남길 수 있습니다.