MyCloud

JAVA의 HashSet, TreeSet 본문

Programming/Data Structure

JAVA의 HashSet, TreeSet

Swalloow 2016. 3. 13. 16:59



Set - HashSet


자바 컬렉션에서 제공하는 Set 인터페이스는 순서를 유지하지 않는 데이터의 집합입니다.
Map 구조와 달리 중복을 허용하지 않는다는 특징이 있습니다.
HashSet은 내부적으로 해싱(Hashing)을 이용해서 구현한 컬렉션입니다.
HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하려면 LinkedHashSet을 사용해야 합니다.








JAVA의 HashSet 구현


HashSet 을 활용한 아래 코드를 통해 주요 메서드와 사용법을 알아보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class HashSetTest {
    public static void main(String[] args) {
        String[] strArr = {"a""a""b""c""d""e"};
        Set<String> set =  new HashSet<String>();
        
        for(int i = 0; i < strArr.length; i++) {
            set.add(strArr[i]);
        }
        for(String str: strArr) {
            set.add(str);
        }
        
        System.out.println(set);
        
        set.remove("b");
        set.removeAll(set);
        set.clear();
    }
}
cs


저장하는 배열은 스트링 타입으로 지정하였습니다.
HashSet은 Set 인터페이스를 상속받기 때문에 위와 같이 생성하였습니다.

HashSet에 객체를 추가할 때 add 메서드를 사용합니다.
첫번째는 for문을 통해 배열의 길이만큼 반복문을 돌리는 방법,
두번째는 요소를 하나씩 저장하는 방법입니다.
HashSet은 중복되는 값을 무시하기 때문에 저장 결과는 (a, b, c, d, e) 가 됩니다.


remove는 지정된 객체를 HashSet에서 삭제하는 메서드,
removeAll과 clear는 저장된 모든 객체를 삭제하는 메서드입니다.
이 밖에도 isEmpty, contains, size 등의 메서드가 있습니다.







Set - TreeSet


TreeSet은 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장하는 컬렉션입니다.
이진탐색트리 중에서도 성능을 향상시킨 '레드-블랙 트리(Red-Black Tree)로 구현되어 있습니다.
따라서 데이터의 추가, 삭제에는 시간이 걸리지만, 검색과 정렬이 뛰어나다는 장점이 있습니다.
TreeSet은 마찬가지로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 

저장순서를 유지하지 않습니다.







JAVA의 TreeSet 구현


TreeSet을 활용한 아래 코드를 통해 주요 메서드와 사용법을 알아보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<String>();
        
        set.add("apple");
        set.add("airplane");
        set.add("alien");
        set.add("disc");
        set.add("dance");
        
        System.out.println(set.headSet("b"));
        System.out.println(set.subSet("a""al"));
        System.out.println(set.tailSet("c"));
        
    }
}
cs


add 메서드는 지정된 객체를 TreeSet에 저장하는 메서드 입니다.
a로 시작하는 단어 3개, d로 시작하는 단어 2개를 저장하였습니다.


headSet, subSet, tailSet은 TreeSet의 중요한 메서드입니다.
headSet은 지정된 객체보다 작은 값의 객체들을 반환합니다.
위의 경우 "b" 보다 작은 값인 "a"로 시작하는 객체들을 반환합니다. (apple, airplane, alien)
subSet은 범위검색의 결과를 반환합니다. 앞에 오는 것이 from, 뒤에 오는 것이 to 입니다.
따라서 위의 경우 "a" 와 "al" 사이의 객체들을 반환합니다. (airplane)
tailSet은 지정된 객체보다 큰 값의 객체들을 반환합니다.
위의 경우에는 "c" 보다 큰 값인 "d"로 시작하는 객체들을 반환합니다. (disc, dance)

이처럼 TreeSet은 문자열 검색, 자동완성 등과 같은 곳에도 활용할 수 있습니다.






HashSet과 TreeSet 비교


HashSet과 TreeSet 모두 중복을 허용하지 않고 순서가 없는 컬렉션입니다.

1. 구현 방식
 - HashSet은 해싱을 이용하여 구현
 - TreeSet은 이진탐색트리를 이용하여 구현

2. 속도 비교
 - HashSet > TreeSet
 - 해싱이 이진탐색트리보다 빠르다

3. 정렬 기능
 - HashSet < TreeSet
 - 이진탐색트리를 이용했기 때문에 데이터 정렬이 가능 (Comparator 이용)



'Programming > Data Structure' 카테고리의 다른 글

JAVA의 HashMap, HashTable  (0) 2016.03.20
JAVA의 BinarySearchTree  (3) 2016.03.13
JAVA의 BinaryTree  (0) 2016.03.13
JAVA의 Tree  (1) 2016.03.13
JAVA의 Queue  (0) 2016.03.11
Comments