9osari.log
← All posts

[JAVA] Set

July 28, 2025 · 3 min read · #java#김영한-java-중급

Set

HashSet

LinkedHashSet

TreeSet

트리 구조

image.png

이진 탐색 트리의 핵심은 입력 순서가 아니라, 데이터의 값을 기준으로 정렬해서 보관한다는 점이다.

public class JavaSetMain {
    public static void main(String[] args) {
        run(new HashSet<String>()); //입력 순서 보장 안함 O(1)
        run(new LinkedHashSet<String>()); //입력 순서 보장 O(1)
        run(new TreeSet<String>()); //데이터 값을 기준으로 정렬 O(log N)
    }

    private static void run(Set<String> set) {
        System.out.println("set = " + set.getClass());

        set.add("C");
        set.add("B");
        set.add("A");
        set.add("D");
        set.add("1");
        set.add("2");

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) { //다음 데이터 확인
            System.out.print(iterator.next() + " "); //다음 데이터 반환
        }
        System.out.println();
    }
}
//출력결과
set = class java.util.HashSet
A 1 B 2 C D 
set = class java.util.LinkedHashSet
C B A D 1 2 
set = class java.util.TreeSet
1 2 A B C D 

HashSet, LinkedHashSet, TreeSet 모두 Set 인터페이스를 구현하기 때문에 구현체를 변경하면서 실행할 수 있다.

iterator() → 컬렉션 반복 출력

HashSet 과 최적화

통계적으로 입력한 데이터 수가 배열의 크기를 75% 정도 넘어가면 해시 인덱스가 자주 충돌한다. 따라서 성능이 떨어진다.

자바의 HashSet데이터의 양이 배열의 크기 75%를 넘어가면 배열의 크기를 2배로 늘리고 2배 늘어난 크기를 기준으로 모든 요소에 해시 인덱스를 다시 적용한다. 해시 인덱스를 다시 적용하는데 시간이 걸리지만 해시 충돌이 줄어든다.

HashSet의 기본 크기 → 16


실무에서는 Set이 필요한 경우 HashSet을 가장 많이 사용한다. 그리고 입력 순서 유지, 값 정렬의 필요에 따라서 LinkedHashSet, TreeSet을 선택하자.



출처: 김영한의 실전 자바 - 중급 2편

···
← PREV [JAVA] HashSet NEXT → [JAVA] Map / Stack / Queue