HashSet이란?
자바의 HashSet은 AbstractSet 클래스를 상속하고 Set 인터페이스를 구현한 컬렉션 클래스입니다. 이름 그대로 내부적으로 해시 테이블(hash table)을 사용해 데이터를 저장하며, 중복된 요소를 허용하지 않는 특징을 가지고 있습니다.
해싱(Hashing)의 원리
해시 테이블은 해싱(hashing)이라는 메커니즘을 통해 정보를 저장합니다. 해싱에서는 키(key)의 내용을 기반으로 고유한 값인 해시 코드(hash code)를 생성합니다.
생성된 해시 코드는 해당 키와 연관된 데이터가 저장될 인덱스(index) 역할을 합니다. 즉, 키를 해시 코드로 변환하는 과정은 개발자가 직접 처리할 필요 없이 자동으로 수행되며, 이 덕분에 HashSet은 빠른 검색과 삽입 속도를 제공할 수 있습니다.
HashSet 기본 사용 예제
다음은 자바에서 HashSet을 생성하고 요소를 추가하는 기본적인 예제입니다.
import java.util.*;
public class Demo {
public static void main(String args[]) {
HashSet <String> hashSet = new HashSet <String>();
hashSet.add("One");
hashSet.add("Two");
hashSet.add("Three");
hashSet.add("Four");
hashSet.add("Five");
hashSet.add("Six");
System.out.println("Hash set values = "+ hashSet);
}
}실행 결과
Hash set values = [Five, Six, One, Four, Two, Three]
출력 결과를 보면 알 수 있듯이, HashSet은 요소를 추가한 순서를 보장하지 않습니다. 저장 순서와 무관하게 해시 알고리즘에 따라 정렬되어 출력되는 점을 유의해야 합니다.
HashSet에서 요소 삭제하기
HashSet의 remove() 메서드를 사용하면 특정 요소를 삭제할 수 있습니다. 이 메서드는 해당 요소가 성공적으로 제거되었는지 여부를 boolean 값으로 반환합니다.
import java.util.*;
public class Demo {
public static void main(String args[]) {
HashSet <String> newset = new HashSet <String>();
newset.add("Learning");
newset.add("Easy");
newset.add("Simply");
System.out.println("Values before remove: "+newset);
boolean isremoved = newset.remove("Easy");
System.out.println("Return value after remove: "+isremoved);
System.out.println("Values after remove: "+newset);
}
}실행 결과
Values before remove: [Learning, Easy, Simply] Return value after remove: true Values after remove: [Learning, Simply]
정리
HashSet은 해시 테이블 기반으로 동작하는 Set 구현체로, 다음과 같은 특징을 가집니다.
- 중복 허용 안 함: 동일한 요소는 하나만 저장됩니다.
- 순서 보장 없음: 입력 순서와 출력 순서가 다를 수 있습니다.
- 빠른 처리 속도: 해싱 기반으로 add, remove, contains 연산이 평균 O(1)의 시간 복잡도를 가집니다.
- null 값 허용: 하나의 null 요소를 저장할 수 있습니다.
중복 제거와 빠른 조회가 필요한 경우 HashSet은 매우 유용한 선택지입니다.