프로그래밍/JAVA

java Collection - Set 정리

p-a-r-k 2020. 3. 10. 19:58
반응형

Set

Set은 중복된 요소를 포함할 수 없다. List와는 다르게 인덱스를 사용하지않아서 인덱스 매개변수가 없다.

Set을 구현한 클래스목록

  • HashSet (순서가 필요없는 데이터를 hash table에 저장. Set 중에 가장 성능이 좋음)

  • Linked HashSet (저장된 데이터의 값에 따라 정렬됨. red-black tree 타입으로 값이 저장. HashSet보다 성능이 느림)

  • TreeSet (연결된 목록 타입으로 구현된 hash table에 데이터 저장. 저장된 순서에 따라 값이 정렬. 셋 중 가장 느림)

성능 차이가 나는 이유는 데이터 정렬 때문이다.

HashSet

public class TestHashSet {
    public static void main(String[] ar) {
        HashSet h1 = new HashSet();
        HashSet h2 = new HashSet();

        h1.add("박정환");
        h1.add("김동현");
        System.out.println(h1.add("김희수")); // true
        System.out.println(h1.add("김희수")); // false

        // for 문 이용한 요소 조회
        for (String e : h1) {
            System.out.print(e + " "); // 박정환 김희수 김동현
        }

        h2.add("박정환");
        h2.add("김동현");
        h2.add("김희수");

        // iterator() 메서드를 이용한 요소 조회
        Iterator iter = h2.iterator();
        while (iter.hasNext()) {
            System.out.print(iter.next() + " "); // 박정환 김희수 김동현
        }

        // size() 메서드를 이용한 개수 조회
        System.out.println("크기 : "+ h2.size()); // 3
    }
}

요소의 저장 순서를 바꿔도 저장되는 순서에는 영향을 미치지 않는 것을 확인할 수 있다.

LinkedHashSet

중복된 데이터를 저장할 수 없다. 차이점은 입력된 순서대로 데이터를 관리한다.

public class TestLinkedHashSet {
    public static void main(String[] ar) {
        Set h1 = new LinkedHashSet();
        Set h2 = new LinkedHashSet();

        h1.add("박정환");
        h1.add("김동현");
        System.out.println(h1.add("김희수")); // true
        System.out.println(h1.add("김희수")); // false

        // for 문 이용한 요소 조회
        for (String e : h1) {
            System.out.print(e + " "); // 박정환 김동현 김희수
        }

        h2.add("박정환");
        h2.add("김동현");
        h2.add("김희수");

        // iterator() 메서드를 이용한 요소 조회
        Iterator iter = h2.iterator();
        while (iter.hasNext()) {
            System.out.print(iter.next() + " "); // 박정환 김동현 김희수
        }

        // size() 메서드를 이용한 개수 조회
        System.out.println("크기 : "+ h2.size()); // 3
    }
}

입력한 순서대로 값이 출력되는것을 확인할 수 있다..

TreeSet

데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary search tree)의 형태로 요소를 저장한다. (기본적으로 오름차순)

public class TestTreeSet {
    public static void main(String[] ar) {
        TreeSet ts = new TreeSet();

        ts.add(30);
        ts.add(40);
        ts.add(20);
        ts.add(10);

        // for 을 이용한 요소 조회
        for (Integer e : ts) {
            System.out.print(e + " "); // 10 20 30 40
        }

        ts.remove(40);

        Iterator iter = ts.iterator();
        while (iter.hasNext()) {
            System.out.print(iter.next() + " "); // 10 20 30
        }

        System.out.println("크기 : " + ts.size()); // 3

        // subSet() 메소드를 이용한 부분 집합의 출력
        System.out.println(ts.subSet(10, 20));
        System.out.println(ts.subSet(10, true, 20, true));
    }
}

저장된 요소들이 모두 정렬된 상태로 출력되는것을 확인할 수 있다..

반응형