본문 바로가기
기초 및 언어/▶ Java&JSP

33. HashSet

by 류딩이 2025. 8. 26.

HashSet 정리

 

1) Set/HashSet

  • 중복 허용 X, 순서 없음(정렬/삽입 순서 보장 X)
  • Set 인터페이스 계열의 클래스
  • 저장순서를 유지하지 않는다. 순서의 의미가 없다.
  • 순서의 개념이 아니라 집합의 개념이므로 삽입한 순서대로 나오지 않을 수 있다.
  • 인덱스 개념이 없으므로 get(index) 없음반복은 보통 Iterator/for-each 사용

 

 

2) HashSet 주요 메서드 표

 

메서드 설명
add(E e) 요소 추가 (이미 있으면 무시, size 변동 없음)
addAll(Collection<? extends E>) 여러 요소 한꺼번에 추가
size() 요소 개수
isEmpty() 비어 있으면 true
contains(Object o) 특정 값 포함 여부
remove(Object o) 해당 값 삭제(true/false)
clear() 전체 삭제
iterator() 반복자 반환(순회용)

 

Iterator 메서드 미니표

메서드  설명
hasNext() 다음 요소 존재 여부
next() 다음 요소 반환
remove() 마지막 반환 요소 삭제(옵션)

 


 

3) Ex09_HashSet — 기본 사용 & 순회

import java.util.HashSet;
import java.util.Iterator;

public class Ex09_HashSet {
    public static void main(String[] args) {
        HashSet<String> hs = new HashSet<>();
        System.out.println(hs.size()); // 0

        hs.add("banana");
        hs.add("orange");
        hs.add("banana"); // 중복 → 무시
        hs.add("apple");
        hs.add("grape");
        hs.add("banana"); // 중복 → 무시

        System.out.println(hs.size()); // 4 (banana, orange, apple, grape)
        System.out.println(hs);        // [grape, banana, orange, apple] 등 — 순서 보장 X
        System.out.println(hs.isEmpty()); // false (요소가 있으므로)

        System.out.println("==========Iterator==========");
        Iterator<String> iter = hs.iterator();
        while (iter.hasNext()) {
            String s = iter.next();
            System.out.println(s);
        }

        System.out.println("==========contains==========");
        boolean c = hs.contains("까꿍"); // 포함 여부
        System.out.println(c);           // false

        System.out.println("==========remove==========");
        boolean r = hs.remove("apple");
        System.out.println(r); // 삭제 성공:true, 실패:false
        System.out.println(hs);
    }
}

 

포인트

  • isEmpty()는 비었을 때만 true; 요소가 있으면 false

4) Ex10_HashSet — 로또 번호 생성 (중복 제거 활용)

(A) for문으로 로또 생성

int i = 0;
int[] arr = new int[6];
while (true) {
    arr[i] = (int)(Math.random() * 11) + 1; // 현재 1~11 범위
    for (int j = 0; j < i; j++) {
        if (arr[i] == arr[j]) { // 중복이면 다시 뽑기
            arr[i] = (int)(Math.random() * 11) + 1;
            j = -1; // 처음부터 재검사
        }
    }
    i++;
    if (i == 6) break;
}
System.out.println(java.util.Arrays.toString(arr));
  • 📌 범위 주의: (int)(Math.random()*11)+1 → 1~11. 실제 로또와 같이 1~45가 필요하면 *45로 변경

(B) HashSet으로 로또 생성

java.util.HashSet<Integer> lt = new java.util.HashSet<>();
int count = 0;
while (lt.size() < 6) {
    int ran = (int)(Math.random() * 45) + 1; // 1~45 권장
    lt.add(ran); // 중복이면 자동 무시
    count++;
}
System.out.println(lt);
System.out.println("반복횟수 : " + count);
  • 조건은 lt.size() < 6 하나면 충분 → 중복 자동 제거

5) 마무리 요약

  • HashSet은 중복 제거가 핵심, 순서 보장 없음
  • 인덱스 접근 대신 Iterator/for-each로 순회
  • 중복 없이 N개 뽑기 문제는 HashSet으로 간단히 해결 가능
  • 로또 범위는 상황에 맞게 조정(예: 1~45)

 

 

'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글

35. 바이트스트림  (0) 2025.08.26
34. HashMap  (1) 2025.08.26
32. Vector와 Enumeration  (1) 2025.08.26
31. ArrayList  (5) 2025.08.24
30. 컬렉션(Collection)  (0) 2025.08.24