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.onut.println("저장된 데이터 수: " + hSet.size()); System.out.println(hSet); /* ============ 저장된 데이터 수: 2 [LEE(10세), PARK(35세)] */
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Person {
private String name;
private int age;
public Person(String n, int a) {
name = n;
age = a;
}
@Override
public String toString() {
return name + "(" + age + "세)";
}
@Override
public int hashCode() {
return age % 3; // 군집 생성을 위한 방 만드는 과정
}
@Override
public boolean equals(Object obj) {
if ((name.equals(((Person) obj).name)) && (age == (((Person) obj).age))) { // 동등비교 과정 , 중복값을 거르기 위한 과정
return true;
} else {
return false;
}
}
}
public class setTest {
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세)]
}
}
출력결과
public class collectionFramework4 {
public static void main(String[] args) {
Set<Integer> lotto = new HashSet<>();
while (lotto.size() < 6) {
int random = (int) ((Math.random() * 45) + 1);
lotto.add(random);
}
System.out.println(lotto);
}
}
출력결과
중복이 나오지 않는 이유: HashCode(); equals();가 Override 됐기 때문
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 7799 9955 */
package wrap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Num3 {
private int num;
public Num3(int num) {
this.num = num;
}
@Override
public String toString() {
return String.valueOf(num); // num은 int형이기 때문에 valueOf 활용
}
@Override
public int hashCode() {
return num % 2; // 군집 생성을 위한 방 만드는 과정
}
@Override
public boolean equals(Object obj) {
if (num == ((Num3) obj).num) {
return true;
} else {
return false;
}
}
}
public class setTest {
public static void main(String[] args) {
HashSet<Num3> set = new HashSet<>();
set.add(new Num3(7799));
set.add(new Num3(9955));
set.add(new Num3(7799));
System.out.println("인스턴스 수: " + set.size());
for (Num3 n : set)
System.out.print(n.toString() + '\t');
System.out.println();
/*
* ====출력 인스턴스 수: 2 7799 9955
*/
}
}
출력결과
hash code의 호출로 군집히 형성되면 그 군집 내의 요소들을 비교해 나간다.
Set 호출에는 2단계를 거쳐 진행된다.
클래스에 정의된 hashCode 메소드의 반환 값을 통해 분류.
선택된 부류 내에서 equals 메소드를 호출하여 비교.
따라서 Set은 hashCode를 기반으로 분류된 데이터 속에서 탐색을 하면 되기 때문에 탐색속도가 높다.