Set과 Hash Set의 핵심

데이터를 저장하는 추상 자료형 (ADT)

  • 순서를 보장하지 않음

  • 데이터 중복을 허용하지 않음

  • 데이터 조회(search)가 List 보다 빠르다.

사용 예시?

  • 중복된 데이터를 제거해야 할 때

  • 데이터의 존재 여부를 확인해야 할 때

  • 용인시 사업 지원자 주민번호를 수혜자 주민번호에 있는지 확인 할 때, List 보단Set으로 관리하고 contain 하는지 확인하면 O(1)에 확인할 수 있다.

Set 구현체

  • hash set

  • linked hash set (java)

  • tree set (java)

Hash set

  • 해시 테이블(hash table)을 사용하여 구현

  • 크기 상관 없이 데이터 조회가 빠름

PRESENT -> dummy 값

List와 Set 중 무엇을 쓸까?

Set을 사용하는게 더 적절한 상황이 아니라면, 거의 대부분 List를 사용한다고 봐도 무리가 없다.

데이터들 자체가 이미 중복이 없고, 순서 상관없이 iteration(loop를 돌면서 한 번씩 접근) 목적으로만 저장하려고 한다면 List와 Set 중 아무거나 사용해도 괜찮은가? List 사용하는게 더 빠르다. index 기반이기 때문에?

for (String name : names) {
    // name으로 뭔가를 수행
}

✅ 결론 요약

단순히 "순차적으로 한 번 도는(iteration)" 용도만이라면 ListSet보다 메모리 구조상 더 효율적입니다. 왜냐하면:

ArrayList는 내부적으로 연속된 배열을 사용하지만, HashSet은 내부적으로 HashMap 기반의 해시 버킷 구조를 가지므로 메모리 접근이 비연속적이고, 더 복잡합니다.


✅ 메모리 구조 비교

🔹 ArrayList (List 기반)

private Object[] elementData;
  • 요소가 배열에 연속적으로 저장

  • 메모리 접근이 캐시 친화적 (CPU 캐시 효율 높음)

  • 순차 반복에 매우 최적화되어 있음

🔹 HashSet (Set 기반)

// 내부적으로 이렇게 되어 있음
Map<E, Object> map = new HashMap<>();
  • HashSet.add(e)map.put(e, DUMMY)

  • HashMap은 내부에 해시 버킷을 두고, 충돌 시 LinkedList 또는 TreeNode로 연결

  • 구조적으로 배열 + 연결 리스트/트리 혼합

  • 요소들이 메모리상 비연속적으로 배치

    • 해시 값에 따라 해시 버킷에 저장하므로 띄엄띄엄 저장되어있


✅ 순차 반복(iteration) 성능 차이

항목

ArrayList

HashSet

메모리 접근

연속적 (빠름)

불연속적 (느림)

반복 성능

매우 빠름 (O(n))

느림 (O(n), but 더 많은 메모리 접근 발생)

캐시 효율

높음

낮음

구조

배열 기반

해시 + 연결구조


✅ 결론

✔ 단순히 한 번만 순회(iteration)할 거라면, ArrayList가 더 빠르고 더 메모리 효율적입니다.

Set은 "검색/중복 방지/삭제"에 특화된 구조지, 순차 접근만 하는 경우에 굳이 쓸 필요는 없습니다.


💡 추천

상황
추천

중복 제거 + 빠른 검색이 필요

HashSet

순차적 접근만 필요 (인덱스 or 반복)

ArrayList

순서 보존 + 중복 제거

LinkedHashSet

자동 정렬된 집합 필요

TreeSet

출처:

Last updated