반응형
Set
정의 : 중복되지 않는 데이터의 집합 => 수학적으로 집합과 동일하다.
특징 :
- 데이터가 중복되지 않는다.
- 순서가 보장될수도 있다.
Set은 인덱스로 관리하지 않는다고 했다. 그러므로 데이터를 검색하기 위해서는 iterator() 메서드로 반복자를 생성하고 데이터를 가져와야 한다.
시간복잡도를 먼저 알아보자
추가적으로 HashSet이 TreeSet이나 LinkedHashSet보다 성능이 더 빠르고, 메모리를 적게 사용한다.
1). HashSet
정의 : 중복이 안되고 순서가 없는 형태의 Set
특징 :
- 빠른 접근속도
- 중복 허용하지 않음
- 순서 보장하지 않음 => 순차적으로 정렬해준다고 100% 믿으면 안됀다.
예제 :
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("3"); // 데이터 저장(추가)
set.add("2");
set.add("1");
set.add("3");
set.add("2");
set.add("4");
set.add("5");
set.add("6");
System.out.println("데이터 수 : " + set.size()); // 데이터 수 출력
Iterator<String> iter = set.iterator(); // Iterator(반복자) 생성
while (iter.hasNext()) { // hasNext() : 데이터가 있으면 true 없으면 false
System.out.println(iter.next()); // next() : 다음 데이터 리턴
}
System.out.println("===================");
set.remove("6"); // 데이터 제거
System.out.println("데이터 수 : " + set.size()); // 저장된 데이터 수 출력
iter = set.iterator(); // 반복자 재생성(위의 반복문에서 next 메서드로 데이터를 다 가져왔기 때문에 재생성)
while (iter.hasNext()) {
System.out.println(iter.next());
}
System.out.println("===================");
}
결과 :
데이터 수 : 6
1
2
3
4
5
6
===================
데이터 수 : 5
1
2
3
4
5
===================
2). TreeSet
정의 : HashSet에서 값에 따라(a-z, 1-9) 순서를 만들어 주는 Set
특징 :
- 중복 허용하지 않음
- 정렬된 순서에 의해 반복됨 => 정렬순서
- 이진탐색트리(Red-Black Tree)의 형태로 데이터를 저장한다.
예제 : 순서를 뒤죽박죽으로 섞었다.
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
set.add("3"); // 데이터 저장(추가)
set.add("2");
set.add("1");
set.add("3");
set.add("2");
set.add("4");
set.add("5");
set.add("6");
System.out.println("데이터 수 : " + set.size()); // 데이터 수 출력
Iterator<String> iter = set.iterator(); // Iterator(반복자) 생성
while (iter.hasNext()) { // hasNext() : 데이터가 있으면 true 없으면 false
System.out.println(iter.next()); // next() : 다음 데이터 리턴
}
System.out.println("===================");
set.remove("three"); // 데이터 제거
System.out.println("데이터 수 : " + set.size()); // 저장된 데이터 수 출력
iter = set.iterator(); // 반복자 재생성(위의 반복문에서 next 메서드로 데이터를 다 가져왔기 때문에 재생성)
while (iter.hasNext()) {
System.out.println(iter.next());
}
System.out.println("===================");
}
결과 :
데이터 수 : 6
1
2
3
4
5
6
===================
데이터 수 : 5
1
2
3
4
5
===================
2). LinkedHashSet
정의 : add 한 순서에 따라 순서가 결정되는 Set
특징 :
- 중복 허용하지 않음
- 삽입 순서에 의해 반복됨 => 순서 제공
예제 :
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("3"); // 데이터 저장(추가)
set.add("2");
set.add("1");
set.add("3");
set.add("2");
set.add("4");
set.add("5");
set.add("6");
System.out.println("데이터 수 : " + set.size()); // 데이터 수 출력
Iterator<String> iter = set.iterator(); // Iterator(반복자) 생성
while (iter.hasNext()) { // hasNext() : 데이터가 있으면 true 없으면 false
System.out.println(iter.next()); // next() : 다음 데이터 리턴
}
System.out.println("===================");
set.remove("6"); // 데이터 제거
System.out.println("데이터 수 : " + set.size()); // 저장된 데이터 수 출력
iter = set.iterator(); // 반복자 재생성(위의 반복문에서 next 메서드로 데이터를 다 가져왔기 때문에 재생성)
while (iter.hasNext()) {
System.out.println(iter.next());
}
System.out.println("===================");
}
결과 :
데이터 수 : 6
3
2
1
4
5
6
===================
데이터 수 : 5
3
2
1
4
5
===================
그럼 언제 HashSet을 써야하나??
만약 중복을 허용하지 않은 데이터를 컨트롤할때 특정 값을 조회한다면, List보다 훨씬 빠른 성능을 낸다고 한다.
반응형