Java HashSet
자바 HashSet
: 개념 및 사용법
- *
HashSet
*은 자바에서 제공하는 집합(Set) 자료 구조로, 중복을 허용하지 않는 데이터의 모음을 관리할 수 있는 클래스입니다.HashSet
은 **해시 테이블(Hash Table)**을 기반으로 동작하며, 저장된 요소들의 순서를 유지하지 않습니다. 또한null
값을 허용할 수 있습니다.
주요 특징은 다음과 같습니다:
- 중복을 허용하지 않음: 같은 요소가 여러 번 저장되지 않습니다.
- 순서를 보장하지 않음: 저장된 순서가 중요하지 않으며, 삽입 순서를 보장하지 않습니다.
- 빠른 검색과 삽입: 해시 테이블을 사용하여 빠른 검색, 삽입, 삭제 성능을 제공합니다.
null
허용:HashSet
은 하나의null
값을 허용합니다.
1. HashSet
의 특징
- 중복 요소 불허: 중복된 값을 허용하지 않으며, 동일한 값이 이미 존재하면 추가되지 않습니다.
- 순서 유지 안 함: 삽입된 순서를 유지하지 않고, 저장된 순서가 임의로 결정됩니다.
- 빠른 데이터 접근: 해시 테이블을 사용하여 평균적으로 O(1)의 시간 복잡도로 데이터 검색, 삽입, 삭제가 가능합니다.
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.
HashSet
과TreeSet
의 차이점
특징 | HashSet |
TreeSet |
---|---|---|
중복 허용 | 중복 허용하지 않음 | 중복 허용하지 않음 |
순서 유지 여부 | 요소의 순서를 유지하지 않음 | 요소를 자동으로 정렬된 상태로 유지 |
성능 | 평균적으로 O(1) 시간 복잡도 | O(log n) 시간 복잡도 |
사용 사례 | 빠른 삽입과 검색이 필요할 때 | 요소를 정렬된 상태로 유지해야 할 때 |
TreeSet
은 자동으로 오름차순 정렬된 상태로 데이터를 저장합니다. 데이터가 정렬된 상태로 유지되어야 하는 경우 TreeSet
을
사용하는 것이 적합합니다.
6. HashSet
과 LinkedHashSet
의 차이점
특징 | HashSet |
LinkedHashSet |
---|---|---|
순서 유지 여부 | 삽입된 순서를 유지하지 않음 | 삽입 순서를 유지 |
성능 | 평균적으로 더 빠름 | 삽입 순서를 유지하는 추가 작업으로 약간 느림 |
사용 사례 | 순서가 중요하지 않을 때 사용 | 데이터 |
의 삽입 순서를 유지해야 할 때 사용 |
LinkedHashSet
은 HashSet
의 모든 기능을 제공하면서도 삽입 순서를 유지하는 특성을 가지고 있습니다.
7. HashSet
과 HashMap
의 차이점
특징 | HashSet |
HashMap |
---|---|---|
구조 | 단일 값 저장 (Set 데이터 구조) | 키-값 쌍으로 데이터 저장 (Map 데이터 구조) |
중복 허용 여부 | 중복을 허용하지 않음 | 키는 중복을 허용하지 않으나, 값은 중복을 허용 |
기능 | 요소의 존재 여부를 확인할 때 적합 | 키-값 쌍으로 데이터를 저장하고, 값 검색에 적합 |
HashSet
은 내부적으로 HashMap
을 사용하여 데이터를 저장합니다. HashSet
은 오직 값(value)만 저장하고 관리하지만,
HashMap
은 키와 값을 함께 저장하며, 특정 키를 통해 값을 검색할 수 있는 자료 구조입니다.
요약
- *
HashSet
*은 중복을 허용하지 않고, 요소의 저장 순서를 유지하지 않는 집합 자료 구조입니다. - 빠른 데이터 삽입, 삭제, 검색이 필요한 경우 유용하며, 해시 테이블을 사용하여 평균 O(1)의 시간 복잡도를 가집니다.
- 주요 메서드로는
add()
,remove()
,contains()
,size()
,clear()
등이 있으며, 데이터를 추가하고 삭제하거나 존재 여부를 확인할 수 있습니다. HashSet
은 순서가 중요하지 않은 경우에 사용되며, 순서가 중요한 경우에는 **LinkedHashSet
*을, 정렬이 필요한 경우에는 **TreeSet
*을 사용할 수 있습니다.
HashSet
은 자바 컬렉션 프레임워크에서 중복 없이 데이터를 관리하고 빠른 검색이 필요한 상황에서 유용하게 사용할 수 있는 자료 구조입니다.