Collection 인터페이스의 하위 인터페이스null 값 저장 가능 (단, 하나만)요소의 정렬 여부는 구현체에 따라 다름:
| 구현체 | 특징 |
|---|---|
HashSet | 순서 보장 X |
LinkedHashSet | 삽입 순서 유지 |
TreeSet | 자동 정렬 (오름차순 기본) |
| 메소드 | 설명 |
|---|---|
add(E e) | 요소 추가 (이미 존재하면 추가 X) |
remove(Object o) | 요소 제거 |
contains(Object o) | 존재 여부 확인 |
size() | 요소 개수 반환 |
isEmpty() | 비어 있는지 확인 |
clear() | 모든 요소 제거 |
Set 인터페이스의 대표 구현체null 저장 가능hashCode() 값 계산
hashCode % 5로 저장 위치 결정해시 충돌(Collision) 처리
LinkedList, Java 8부터는 일정 개수 초과 시 Red-Black Tree로 변환equals()로 중복 여부 확인
equals()로 비교하여 정확한 중복 여부 판별저장
add() 메소드는 내부적으로 HashMap.put() 사용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("apple"); // 중복 무시
System.out.println(set); // [banana, apple] (순서 보장 X)
}
}
Java에서 HashSet, HashMap, Hashtable과 같은 해시 기반 컬렉션은 객체를 저장하거나 검색할 때 내부적으로 hashCode()와 equals() 메소드를 사용
이 메소드들을 제대로 재정의하지 않으면, 중복 체크나 검색이 제대로 동작하지 않아 예상치 못한 결과를 낳을 수 있습니다.
hashCode()를 호출해서 저장할 버킷(bucket) 위치를 찾음equals()를 호출해서 동일 객체인지 비교equals() 결과가 true → 중복으로 판단하고 추가하지 않음hashCode()를 재정의하지 않은 경우class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (o instanceof Person) {
return this.name.equals(((Person) o).name);
}
return false;
}
// hashCode()를 재정의하지 않음
}
public class Main {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice")); // 서로 다른 객체지만 equals는 true → hashCode는 달라서 다른 버킷에 저장됨
System.out.println(set.size()); // 출력: 2
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (o instanceof Person) {
return this.name.equals(((Person) o).name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode(); // 문자열의 hashCode 사용
}
}
public class Main {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice")); // equals와 hashCode 모두 같음 → 중복으로 인식
System.out.println(set.size()); // 출력: 1
}
}
Set 인터페이스를 구현한 클래스 중 하나로 중복을 허용하지 않으며, 요소를 자동 정렬함TreeMap을 기반으로 동작Comparator 사용 가능import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
TreeSet<Integer> set = new TreeSet<>();
set.add(30);
set.add(10);
set.add(20);
System.out.println(set); // [10, 20, 30] (자동 오름차순 정렬)
}
}
Set 인터페이스를 구현한 클래스 중 하나LinkedHashMap을 기반으로 동작import java.util.LinkedHashSet;
public class Main {
public static void main(String[] args) {
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("B");
set.add("A");
set.add("C");
System.out.println(set); // [B, A, C] - 입력한 순서 그대로 출력
}
}