코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java HashSet

자바 HashSet: 개념 및 사용법

  • *HashSet*은 자바에서 제공하는 집합(Set) 자료 구조로, 중복을 허용하지 않는 데이터의 모음을 관리할 수 있는 클래스입니다. HashSet은 **해시 테이블(Hash Table)**을 기반으로 동작하며, 저장된 요소들의 순서를 유지하지 않습니다. 또한 null 값을 허용할 수 있습니다.

주요 특징은 다음과 같습니다:

  1. 중복을 허용하지 않음: 같은 요소가 여러 번 저장되지 않습니다.
  2. 순서를 보장하지 않음: 저장된 순서가 중요하지 않으며, 삽입 순서를 보장하지 않습니다.
  3. 빠른 검색과 삽입: 해시 테이블을 사용하여 빠른 검색, 삽입, 삭제 성능을 제공합니다.
  4. null 허용: HashSet은 하나의 null 값을 허용합니다.

1. HashSet의 특징

  1. 중복 요소 불허: 중복된 값을 허용하지 않으며, 동일한 값이 이미 존재하면 추가되지 않습니다.
  2. 순서 유지 안 함: 삽입된 순서를 유지하지 않고, 저장된 순서가 임의로 결정됩니다.
  3. 빠른 데이터 접근: 해시 테이블을 사용하여 평균적으로 O(1)의 시간 복잡도로 데이터 검색, 삽입, 삭제가 가능합니다.
  4. null 값 허용: HashSet은 하나의 null 값을 저장할 수 있습니다.

2. HashSet 선언 및 생성

HashSet은 **제네릭(Generic)**을 사용하여 저장할 데이터 타입을 지정할 수 있습니다. HashSet을 사용하려면 **

.util.HashSet**을 임포트해야 합니다.

선언 및 생성 예제

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        // String 타입의 HashSet 생성
        HashSet<String> set = new HashSet<>();

        // Integer 타입의 HashSet 생성
        HashSet<Integer> numbers = new HashSet<>();
    }
}

위 예제에서는 String 타입의 요소와 Integer 타입의 요소를 각각 저장할 수 있는 HashSet을 생성했습니다. 제네릭을 사용하여 데이터 타입을 지정할 수 있으며, 지정된 타입 이외의 데이터는 저장할 수 없습니다.

3. HashSet 주요 메서드

HashSet은 데이터를 추가, 삭제, 조회하는 여러 가지 메서드를 제공합니다. 주요 메서드는 다음과 같습니다.

3.1 add() - 요소 추가

add() 메서드는 HashSet에 요소를 추가하는 데 사용됩니다. 중복된 값이 추가되면 저장되지 않으며, false를 반환합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();

        // 요소 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");

        // 중복 요소 추가 (저장되지 않음)
        boolean isAdded = set.add("Apple"); // false 반환

        // 출력
        System.out.println(set);  // 출력: [Banana, Apple, Orange]
        System.out.println("Apple 추가 여부: " + isAdded); // 출력: Apple 추가 여부: false
    }
}

3.2 contains() - 요소 포함 여부 확인

contains() 메서드는 HashSet에 특정 요소가 포함되어 있는지 확인합니다. 존재하면 true, 존재하지 않으면 false를 반환합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        // 요소 포함 여부 확인
        System.out.println(set.contains("Apple"));  // 출력: true
        System.out.println(set.contains("Mango"));  // 출력: false
    }
}

3.3 remove() - 요소 삭제

remove() 메서드는 HashSet에서 특정 요소를 제거합니다. 삭제되면 true, 삭제할 요소가 없으면 false를 반환합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        // 요소 삭제
        boolean isRemoved = set.remove("Apple");
        System.out.println("Apple 삭제 여부: " + isRemoved);  // 출력: Apple 삭제 여부: true

        // 삭제 후 출력
        System.out.println(set);  // 출력: [Banana]
    }
}

3.4 size() - 집합의 크기 확인

size() 메서드는 HashSet에 저장된 요소의 개수를 반환합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        // 집합의 크기 확인
        System.out.println(set.size());  // 출력: 2
    }
}

3.5 isEmpty() - 집합이 비어 있는지 확인

isEmpty() 메서드는 HashSet이 비어 있는지 여부를 확인합니다. 비어 있으면 true, 비어 있지 않으면 false를 반환합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();

        // 집합이 비어 있는지 확인
        System.out.println(set.isEmpty());  // 출력: true

        set.add("Apple");

        System.out.println(set.isEmpty());  // 출력: false
    }
}

3.6 clear() - 모든 요소 삭제

clear() 메서드는 HashSet에 저장된 모든 요소를 삭제합니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        // 모든 요소 삭제
        set.clear();

        System.out.println(set);  // 출력: []
    }
}

4. HashSet의 순회

HashSet은 반복문을 사용하여 요소를 순회할 수 있습니다. 일반적으로 향상된 for이나 **Iterator**를 사용하여 HashSet의 요소를 처리합니다.

4.1 향상된 for문을 사용한 순회

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");

        // 향상된 for문을 사용하여 요소 출력
        for (String fruit : set) {
            System.out.println(fruit);
        }
    }
}

4.2 Iterator를 사용한 순회

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

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");

        // Iterator를 사용하여 요소 반복
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

5. HashSetTreeSet의 차이점

특징 HashSet TreeSet
중복 허용 중복 허용하지 않음 중복 허용하지 않음
순서 유지 여부 요소의 순서를 유지하지 않음 요소를 자동으로 정렬된 상태로 유지
성능 평균적으로 O(1) 시간 복잡도 O(log n) 시간 복잡도
사용 사례 빠른 삽입과 검색이 필요할 때 요소를 정렬된 상태로 유지해야 할 때

TreeSet은 자동으로 오름차순 정렬된 상태로 데이터를 저장합니다. 데이터가 정렬된 상태로 유지되어야 하는 경우 TreeSet을 사용하는 것이 적합합니다.

6. HashSetLinkedHashSet의 차이점

특징 HashSet LinkedHashSet
순서 유지 여부 삽입된 순서를 유지하지 않음 삽입 순서를 유지
성능 평균적으로 더 빠름 삽입 순서를 유지하는 추가 작업으로 약간 느림
사용 사례 순서가 중요하지 않을 때 사용 데이터

의 삽입 순서를 유지해야 할 때 사용 |

LinkedHashSetHashSet의 모든 기능을 제공하면서도 삽입 순서를 유지하는 특성을 가지고 있습니다.

7. HashSetHashMap의 차이점

특징 HashSet HashMap
구조 단일 값 저장 (Set 데이터 구조) 키-값 쌍으로 데이터 저장 (Map 데이터 구조)
중복 허용 여부 중복을 허용하지 않음 키는 중복을 허용하지 않으나, 값은 중복을 허용
기능 요소의 존재 여부를 확인할 때 적합 키-값 쌍으로 데이터를 저장하고, 값 검색에 적합

HashSet은 내부적으로 HashMap을 사용하여 데이터를 저장합니다. HashSet은 오직 값(value)만 저장하고 관리하지만, HashMap은 키와 값을 함께 저장하며, 특정 키를 통해 값을 검색할 수 있는 자료 구조입니다.

요약

  • *HashSet*은 중복을 허용하지 않고, 요소의 저장 순서를 유지하지 않는 집합 자료 구조입니다.
  • 빠른 데이터 삽입, 삭제, 검색이 필요한 경우 유용하며, 해시 테이블을 사용하여 평균 O(1)의 시간 복잡도를 가집니다.
  • 주요 메서드로는 add(), remove(), contains(), size(), clear() 등이 있으며, 데이터를 추가하고 삭제하거나 존재 여부를 확인할 수 있습니다.
  • HashSet은 순서가 중요하지 않은 경우에 사용되며, 순서가 중요한 경우에는 **LinkedHashSet*을, 정렬이 필요한 경우에는 **TreeSet*을 사용할 수 있습니다.

HashSet은 자바 컬렉션 프레임워크에서 중복 없이 데이터를 관리하고 빠른 검색이 필요한 상황에서 유용하게 사용할 수 있는 자료 구조입니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com