Java

[Java] Collection 정리 Set이란 HashSet & TreeSet & LinkedHashSet

Jeong Jeon
반응형

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보다 훨씬 빠른 성능을 낸다고 한다.

반응형