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)" 용도만이라면 List
가 Set
보다 메모리 구조상 더 효율적입니다.
왜냐하면:
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