프로그래밍/java

[자바/Java] Set 인터페이스 ( HashSet, LinkedHashSet, TreeSet )

pupu91 2022. 9. 7. 19:09
반응형

 

Set

- 저장 순서가 유지되지 않고, 같은 요소의 중복 저장을 허용하지 않음

(null값도 중복되지 않게 하나의 null값만 저장)

구현 클래스 : HashSet, LinkedHashSet, TreeSet

 

 

 

Set 계열 주요 메소드

 

 

 

 


HashSet

:  Set 컬렉션 클래스에서 가장 많이 사용 되는 클래스

 

 


 

HashSet 특징

: set에 객체를 저장할 때 hash 함수를 사용하여 처리 속도가 빠름

 동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않음

  

 

HashSet 객체 생성

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

 

 

저장 순서가 유지 되지 않음

 

hset.add(new String("java"));  //hset.add("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]

 

 

값이 같은 동등 객체도 중복 저장 X

hset.add(new String("java"));
=> 한번 만들고 생성자로 다시 말들어서 동일객체x 동등객체o

System.out.println(hset);

출력 결과
[css, java, oracle, jdbc, html]

 

 

 

 

contains()

:지정된 객체를 포함하고 있는지 알려줌

값이 같은 동등 객체를 이용해 포함 여부 확인
System.out.println("포함 여부 확인 : " + hset.contains(new String("oracle")));

출력 결과
포함 여부 확인 : true
String 클래스 내에 hashCode, equlas 메소드가 오버라이딩 되어 동등 객체 처리가 가능한 것으로, 직접 만드는 클래스에서 동일한 처리가 될 수 있도록 하려면 hashCode, equlas 메소드를 오버라이딩 해야 함.

 

반응형

 

 

size() 로 요소 개수 확인 가능

System.out.println("저장 된 객체 수 : " + hset.size());

출력 결과
저장 된 객체 수 : 5

 

 

 

 

 

저장 된 객체를 꺼내는 방법

:  해당 기능은 따로 없으며, 인덱스로 접근하는 반복문 사용이 불가능 함

  toArray(), iterator (),  향상된 for문을 활용 

 

 

1) toArray()로 배열로 변경한 뒤 반복문 사용

   - Object[] toArray() : 저장된 객체들을 개체배열의 형태로 반환


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 : htm

 

 

 

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

Iterator<String> iter = hset.iterator();

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

출력 결과
css
java
oracle
jdbc
html

 

 

 

3) 향상된 for문 사용

for(String str : hset) {
	System.out.println("str : " + str);
}

출력 결과
str : css
str : java
str : oracle
str : jdbc
str : html

 

 

 

 

clear() 로 저장된 모든 객체 지우기

hset.clear();

 

 

 

isEmpty() 로 HashSet이 비어있는지 확인하기

System.out.println("empty? : " + hset.isEmpty());
출력 결과
empty? : true

 

 

 


LinkedHashSet 

HashSet과 거의 동일하지만 저장 순서를 유지함

JDK 1.4부터 제공

 

 


 

LinkedHashSet 객체 생성

Set<String> lhset = new LinkedHashSet<>();

 

 

 

저장순서 확인하기

lhset.add("java");
lhset.add("oracle");
lhset.add("jdbc");
lhset.add("html");
lhset.add("css");

System.out.println(lhset);

출력 결과
[java, oracle, jdbc, html, css]

 

 

 

오름차순 정렬

: 만들어진 LinkedHashSet 을 TreeSet으로 객체를 생성하면, 같은 타입의 객체를 자동으로 비교하여 오름차순으로 정렬 함

TreeSet<String> tset = new TreeSet(lhset);
System.out.println(tset);

출력 결과
[css, html, java, jdbc, oracle]

 

 

 

 


TreeSet 

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

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

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

 

 

 


 

TreeSet 객체 생성

Set<String> tset = 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]
=> 저장 순서와 상관 없이 오름차순 정렬 된 상태로 출력

 

 

Iterator 출력 해보기

Iterator <String> iter = tset.iterator();

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

출력 결과
css
html
java
jdbc
oracle

 

 

 

TreeSet의 특징을 이용하여 로또 번호 발생기 만들기

Set<Integer> lotto = new TreeSet<>();

while(lotto.size() < 6){
 	lotto.add((int)(Math.random() * 45) + 1);
}

System.out.println(lotto);

출력 결과
[2, 10, 19, 22, 25, 37]
반응형