HashSet
은 자바 컬렉션 프레임워크에서 제공하는 Set 인터페이스를 구현한 클래스 중 하나로, 중복된 요소를 허용하지 않고 순서가 없는 데이터 집합을 관리하는 자료구조입니다.
HashSet
에 저장된 요소들은 저장된 순서대로 출력되지 않습니다. 순서가 중요한 경우에는 LinkedHashSe
t이나 TreeSet
을 사용하는 것이 좋습니다.package com.util1;
import java.util.HashSet;
public class HashSetEx01 {
public static void main(String[] args) {
// HashSet 생성 (제네릭으로 String 타입만 허용)
HashSet<String> set = new HashSet<>();
// 요소 추가 (add 메서드 사용)
set.add("홍길동");
set.add("박문수");
set.add("임꺽정");
set.add("홍길동"); // 중복된 값은 무시됨
// HashSet 출력 (저장 순서는 보장되지 않음)
System.out.println(set); // 출력: [임꺽정, 박문수, 홍길동]
}
}
HashSet
에서 equals()
와 hashCode()
의 역할HashSet
이 객체를 저장할 때, 먼저 객체의 해시 코드를 계산해서 같은 해시 코드가 있는지 확인합니다. 만약 같은 해시 코드를 가진 객체가 이미 존재한다면, HashSet
은 equals()
메서드를 사용하여 실제 내용이 동일한지 확인합니다. 내용이 동일하면 중복된 객체로 간주하고 저장하지 않습니다.
equals()
와 hashCode()
의 동작 원리HashSet
에 추가될 때, 먼저 객체의 해시 코드를 확인합니다. 같은 해시 코드를 가진 객체가 이미 있다면, 중복될 가능성이 있다고 판단합니다.equals()
로 비교: 같은 해시 코드를 가진 객체가 있다면, equals()
메서드를 통해 실제로 같은 객체인지를 확인합니다. equals()
결과가 true면 중복된 객체로 처리되어 저장되지 않습니다.수업코드
package com.util1;
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 내용값을 비교 : HashSet에서
@Override
public boolean equals(Object o) {
System.out.println("Person.equals 메서드 호출");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
} @Override
public int hashCode() {
System.out.println("Person.hashCode 메서드 호출");
return Objects.hash(name, age);
}
}
package com.util1;
import java.util.HashSet;
public class HashSetEx02 {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 31);
Person p2 = new Person("박문수", 33);
Person p3 = new Person("임꺽정", 35);
HashSet<Person> set = new HashSet<>();
set.add(p1); // 중복 아님 추가됨
set.add(p2); // 중복 아님 추가됨
set.add(p3); // 중복 아님 추가됨
System.out.println(set);
Person p4 = new Person("홍길동", 31);
set.add(p4); // 중복된 객체, 추가되지 않음
// HashSet 출력 (중복된 객체는 추가되지 않음)
System.out.println(set);
}
}