본문 바로가기
Java의 정석/컬렉션 프레임워크

HashSet (1)

by Hwanii_ 2023. 9. 20.
728x90

ch11-34 ~ 36 HashSet (1)

 

11 - 34 HashSet - 순서 X, 중복 X

 

 

Set 인터페이스를 구현한 대표 클래스는 HashSet 과 TreeSet 이다.

 

보통 Set을 사용 해야 한다면 HashSet 클래스를 사용 하면 된다.

 

- Set 인터페이스를 구현한 대표적인 컬렉션 클래스 이다.

 

- 순서를 유지하려면 LinkedHashSet 클래스를 사용 하면 된다.

 

- TreeSet 이란 ?

>>

범위 검색과 정렬에 유리한 컬렉션 클래스 이다.

 

범위 ?

>>

from ~ to

 

예)

10 ~ 20

 

하지만, TreeSet은 HashSet 보다는 데이터 추가 또는 삭제에 시간이 더 걸린다는 단점이 있다.

 

 

 

11 - 34 HashSet - 주요 메서드

 

 

첫번째는 기본 생성자 이다.

 

두번째는 지정된 컬렉션의 모든 객체를 저장하는 오버로딩된 생성자 이다.

 

세번째는 처음 컬렉션의 크기를 어느정도로 할지 크기 지정을 하는 생성자 이다.

 

네번째는 지정된 크기로 언제 늘릴건지를 정해주는 메서드 이다.

 

(int 8, 0.8) 으로 되있다고 가정하면,

기존 컬렉션의 크기가 80%가 차면 8의 크기만큼 크기를 늘린다는 의미 이다.

 

다음으로는 컬렉션에 데이터를 추가 및 삭제를 하기 위한 메서드 이다.

 

 

add(Object o) : 추가

 

addAll(Collection c) : 추가 (합집합) 

 

remove(Object o) : 삭제

 

removeAll(Collection c) : 삭제 (교집합)

 

retainAll(Collection c) : 조건부 삭제 (차집합) (인자에 있는 컬렉션을 제외 하고 모두 삭제)

 

clear() : 모두 삭제

 

그외 메서드 는 아래와 같다.

 

 

 

contains(Object o) : 어떤 특정 객체가 포함되어있으면 true 를 반환 하고, 그렇지 않으면 false 를 반환.

 

containsAll(Collection c) : 특정 컬렉션에 담긴 여러 객체가 모두 포함 되어 있는지를 물어 본다.

 

iterator() : 컬렉션의 요소를 읽어오기 위한 (Read) 메서드 이다.

 

isEmpty() : 비어있는지를 확인 하기.

 

size() : 저장된 객체의 개수.

 

toArray() : Set에 저장되어 있는 객체를 객체배열로 반환 하기.

 

 

 

예제 01 )

 

import java.util.*;

class Ex11_9 {

	public static void main(String[] args) {

		Object[] objArr = {"1",new Integer(1),"2","2","3","3","4","4","4"};
		Set set = new HashSet();

		for(int i=0; i < objArr.length; i++) {
			set.add(objArr[i]);	// HashSet에 objArr의 요소들을 저장한다.
		}
		// HashSet에 저장된 요소들을 출력한다.
		System.out.println(set);	

		System.out.println();

		// HashSet에 저장된 요소들을 출력한다.(Iterator 이용) 
		Iterator it = set.iterator();

		while(it.hasNext()) {
			System.out.println(it.next());	
		}

		System.out.println();

		System.out.println("log : it.hasNext() : " + it.hasNext());

		System.out.println();

		it = set.iterator();	// 한번 더 읽어오려고 Iterator 객체 초기화 하기.

		System.out.println("log : it.hasNext() : " + it.hasNext());

		System.out.println();

		while(it.hasNext()) {
			System.out.println(it.next());
		}

	}

}

 

[1, 1, 2, 3, 4]
1
1
2
3
4

log : it.hasNext() : false

log : it.hasNext() : true

1
1
2
3
4

 

Set은 중복을 허용 하지 않는다 했다.

 

근데 지금 제네릭을 설정 하지 않아서, 모든 타입의 데이터가 Set에 저장될 수 있다.

 

그래서, 하나는 문자 "1" 이고, 다른 하나는 숫자 1 이다.

 

또한, 순서도 유지 하지 않는다.

 

 

 

예제 02 )

 

import java.util.*;

class Ex11_10 {
	
	public static void main(String[] args) {
		
		Set set = new HashSet();
		
		for (int i = 0; set.size() < 6 ; i++) {
			int num = (int) (Math.random() * 45) + 1;
			//	set.add(new Integer(num));
			set.add(num);
		}
		
		System.out.println(set);
		
		System.out.println("======================");

		List list = new LinkedList(set); // LinkedList(Collection c)
		
		Collections.sort(list);          // Collections.sort(List list)
		
		System.out.println(list);
		
	}
	
}

 

[33, 18, 2, 36, 8, 9]
======================
[2, 8, 9, 18, 33, 36]

 

Set은 sort() 메서드를 사용 할 수 없다.

 

 

Collections 의 sort 메서드의 인자로는 List만 올 수 있기 때문 이다.

 

그러면 Set 데이터를 정렬 하고 싶다면 어떻게 해야할까 ???

 

Set 컬렉션 데이터를 List 에 옮기면 된다.

 

List에 옮긴 다음에 List를  정렬 하면 된다.

반응형

'Java의 정석 > 컬렉션 프레임워크' 카테고리의 다른 글

TreeSet (1)  (0) 2023.10.09
HashSet (2)  (0) 2023.10.09
Comparator & Comparable  (0) 2023.09.20
Arrays 클래스  (0) 2023.09.20
Iterator, Enumeration / Map 과 Iterator  (0) 2023.09.20