본문 바로가기

TIL/Java

[Java] 컬렉션(Collection) - 3. Set(HashSet, LinkedHashSet, TreeSet)

Set

- Set인터페이스를 구현한 Set컬렉션 클래스

- 저장 순서 유지X, 같은 요소의 중복 저장X (null값도 중복되지 않게 하나의 null만 저장)

- 구현클래스 : HashSet, LinkedHashSet, TreeSet

 

HashSet 클래스

- Set 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나이다.

- JDK 1.2부터 제공되고 있으며 해시 알고리즘을 사용하여 검색 속도가 빠르다는 장점을 가진다.

- 동일 인스턴스 뿐 아니라 동등 인스턴스도 중복하여 저장하지 않는다.

  (동일 : 완전히 같음 / 동등 : 다른 인스턴스이지만 속성 값 같음)

 

HashSet 인스턴스 생성

		HashSet<String> hset = new HashSet<>();

 

다형성 적용하여 상위 인터페이스를 타입으로 사용가능

		//Set hset2 = new HashSet();
		//Collection hset3 = new HashSet();
        
        	hset.add(new String("java"));
		hset.add(new String("oracle"));
		hset.add(new String("jdbc"));
		hset.add(new String("html"));
		hset.add(new String("css"));

 

출력해보면 저장 순서 유지 안된다.

		System.out.println(hset);
        //[css, java, oracle, jdbc, html]

 

중복도 허용 안됨

		hset.add(new String("java"));
		System.out.println(hset);
        //[css, java, oracle, jdbc, html]

 

객체 수 확인 size()

포합 여부 확인 contains()

		System.out.println("저장 된 객체 수 : " + hset.size());
		System.out.println("포함 여부 확인 : " + hset.contains(new String("oracle")));
출력값=>
저장 된 객체 수 : 5
포함 여부 확인 : true

 

저장된 객체를 하나씩 꺼내는 기능이 없다.

반복문을 이용한 연속 처리 하는 방법

1. toArray()로 배열로 변경한 뒤 for loop 사용

		Object[] arr = hset.toArray();
		for(int i = 0; i < arr.length; i++) {
			System.out.println(i + " : " + arr[i]);
		}
출력값=>
0 : css
1 : java
2 : oracle
3 : jdbc
4 : html

 

2. iterator()로 목록 만들어 연속 처리

		Iterator<String> iter = hset.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
출력값=>
css
java
oracle
jdbc
html

 

지우는 법 clear()

값이 비었는지 확인 isEmpty()

		hset.clear();
		System.out.println("empty? : " +  hset.isEmpty());	//true

LinkedhashSet

- HashSet이 가지는 기능을 모두 가지고 있다.

- 추가적으로 저장 순서를 유지하는 특징을 가진다.

- JDK 1.4부터 제공

 

		LinkedHashSet<String> lhset = new LinkedHashSet<>();
        
        	lhset.add("java");
		lhset.add("oracle");
		lhset.add("jdbc");
		lhset.add("html");
		lhset.add("css");

		System.out.println("lhset : " + lhset);
        //lhset : [java, oracle, jdbc, html, css]

 

만들어진 링크해쉬셋을 가지고 트리셋으로 객체를 생성하면 같은 타입의 객체를 자동으로 비교하여 오름차순 정렬한다.

		TreeSet<String> tset = new TreeSet<>(lhset);
		System.out.println(tset);
        //[css, html, java, jdbc, oracle]

TreeSet

- 데이터가 정렬된 상태로 저장되는 이진 검색 트리의 형태로 요소를 저장한다.

- 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

- 이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.

- Set 인터페이스가 가지는 특징을 그대로 가지지만 정렬된 상태를 유지한다는 것이 다른 점이다.

- JDK 1.2 부터 제공

 

		TreeSet<String> tset = new TreeSet<>();
		//Set<String> tset2 = new TreeSet<>();
		
		tset.add("java");
		tset.add("oracle");
		tset.add("jdbc");
		tset.add("html");
		tset.add("css");
		
		/* 자동 오름차순 정렬 */
		System.out.println(tset);
[css, html, java, jdbc, oracle]

 

목록 만들어서 하나씩 대문자로 변경해서 출력 처리 toUperCase()

		Iterator<String> iter = tset.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next().toUpperCase());
		}
CSS
HTML
JAVA
JDBC
ORACLE

 

배열로 바꾸어 연속 처리하기(위와 출력값 동일) toArray() 

		Object[] arr = tset.toArray();
		
		for(Object obj : arr) {
			System.out.println(((String)obj).toUpperCase());
		}

 

로또 번호 발생기 (TreeSet 특징 이용)

		Set<Integer> lotto = new TreeSet<>();
		
		while(lotto.size() < 6) {
			lotto.add((int)(Math.random() * 45) + 1);
		}
		
		System.out.println("lotto : " + lotto);