Set인터페이스를 구현 클래스이다.
Set의 특징을 그대로 상속받음.(객체 중복이 안되고 저장 순서가 유지 되지 않음)
➀HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸다.
➁저장되어 있는 객체들의 해시 코드와 비교.
➂같은 해쉬 코드가 있다면 다시 equals()메소드로 두 객체 비교.
➃true이면 동일한 객체로 판단하고 중복을 저장을 하지 않는다.
equals()메소드 사용(중복 확인)
import java.util.HashSet;
class Num {
private int num;
public Num(int n) {
num = n;
}
@Override
public String toString() {
return String.valueOf(num);
}
@Override
public int hashCode() {
return num % 3;
}
@Override
public boolean equals(Object obj) {
if (num == ((Num) obj).num)
return true;
else
return false;
}
}
public class Test1 {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for (Num n : set) {
System.out.print(n.toString() + '\t');
}
System.out.println();
}
}
[결과]
인스턴스 수: 2
9955 7799
equals()메소드 제거한 위의 예제
import java.util.HashSet;
class Num {
private int num;
public Num(int n) {
num = n;
}
@Override
public String toString() {
return String.valueOf(num);
}
@Override
public int hashCode() {
return num % 3;
}
}
public class Test1 {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for (Num n : set) {
System.out.print(n.toString() + '\t');
}
System.out.println();
}
}
[결과]
인스턴스 수: 3
9955 7799 7799
HashSet hSet = new HashSet();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));System.onut.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);============
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]
import java.util.HashSet;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return age % 100;
}
@Override
public boolean equals(Object obj) {
if (toString().equals(((Person) obj).toString())) {
return true;
} else {
return false;
}
}
@Override
public String toString() {
return name + "(" + age + "세 )";
}
}
public class Test2 {
public static void main(String[] args) {
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));
System.out.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);
// ============
// 저장된 데이터 수: 2
// [LEE(10세), PARK(35세)]
}
}