
import java.util.HashSet;
HashSet<타입> hashSet = new HashSet<>();
// 다형성 적용
Set<타입> set = new HashSet<>();
HashMap의 key에 null을 허용하기 때문)public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
private transient HashMap<E,Object> map; // 백업용 HashMap
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object(); // 더미 객체
public HashSet() {
map = new HashMap<>();
}
HashMap을 기반으로 동작한다.public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
hashCode()로 해시값을 계산한다.equals()로 완전히 같은 객체인지 비교한다.❗️ HashSet이 중복을 제거하지 못하는 경우
- 추가하려는 요소(ex. 사용자 정의 객체)에
equals(),hashcode()메서드를 오버라이딩 하지 않은 경우- 이 두 메서드가 오버라이딩 되어있지 않으면 완전히 같은 객체여도, 서로 다른 객체로 판단되어 중복이 허용될 수 있다.
HashMap 기반으로 동작하며 Key에 요소를 저장하기 때문에, 중복여부 판단시 Key의 중복 여부만 확인하므로 빠르고 효율적으로 중복 체크가 가능하다.
O(n) : 100명의 사람들에게 사과를 나누어주는 상황 -> 사과를 한명씩 차례로 나누어주는 방식으로 총 100번 나눠주어야 한다.
O(log n) : 사전에서 특정 단어를 찾는 상황 -> 데이터가 정렬된 상태에서 대략적으로 절반씩 범위를 좁히며 원하는 단어를 빠르게 찾을 수 있다.
➡️ 이처럼 입력 크기가 커지면 커질수록 O(log n)이 O(n)보다 훨씬 빠르고 효율적이다.