본문 바로가기
Spring 7기 프로젝트/모임 플렛폼 프로젝트

List.containsAll() vs HashSet.containsAll() 성능 비교

by JuNo_12 2025. 7. 24.

문제 상황

사용자가 선택한 카테고리 ID들이 모두 유효한 카테고리인지 검증하는 로직에서 다음과 같은 코드를 작성했습니다.

boolean allValid = validCategoryIds.containsAll(categoryIds);

이때 IDE에서 "Call to 'list.containsAll(collection)' may have poor performance" 경고가 발생했습니다.


성능 차이 분석

List.containsAll() 방식:

  • 시간복잡도: O(n*m)
  • categoryIds의 각 요소마다 validCategoryIds 전체를 순차 탐색
  • 카테고리 수가 늘어날수록 성능이 급격히 저하

HashSet.containsAll() 방식:

  • 시간복잡도: O(n+m)
  • HashSet 생성 비용 O(n) + 해시 기반 조회 O(m)
  • 카테고리 수가 늘어나도 안정적인 성능

최종 해결책

 

현재는 카테고리 수가 적지만, 서비스 확장을 고려하여 처음부터 효율적인 자료구조를 선택했습니다. 약간의 코드 복잡성 증가가 있지만, 확장성과 성능 안정성을 확보할 수 있습니다.