HashSet은 자바 컬렉션 프레임워크에서 제공하는 Set 인터페이스를 구현한 클래스 중 하나로, 중복된 요소를 허용하지 않고 순서가 없는 데이터 집합을 관리하는 자료구조입니다.
HashSet에 저장된 요소들은 저장된 순서대로 출력되지 않습니다. 순서가 중요한 경우에는 LinkedHashSet이나 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);
}
}