11-37~38 HashSet(2)

oyeon·2020년 12월 27일
0

Java 개념

목록 보기
33/70
  • HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
    (같은 객체가 없으면 저장, 있으면 저장하지 않는다.)
  • How? boolean add(Object o)는 내부적으로 저장할 객체의 equals()와 hashCode()를 호출하여 중복 여부 확인
    (Object 클래스의 메서드 equals()와 hashCode()가 오버라이딩 되어 있어야 함)

equals()와 hashCode() 오버라이딩 예제

public boolean equals(Object obj){
    if(!(obj instanceof Person)) return false;
    
    Person tmp = (Person)obj;
    
    return name.equals(tmp.name) && age == tmp.age;
}
public int hashCode(){
    return Objects.hash(name, age);
}

예제 3

class Ex11_11 {

public static void main(String[] args){
	HashSet set = new HashSet();
	
	set.add("abc");
	set.add("abc");	// 중복이라 저장안 됨.
	set.add(new Person("David", 10));
	set.add(new Person("David", 10));
	
	System.out.println(set);
}
}
// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작.
// eclipse : source menu -> Generate hashCode() and equals()...
class Person{
	String name;
	int age;
	
	@Override
	public int hashCode() {
		// int hash(Object... values); 가변인자
		return Objects.hash(name, age);
	}

	@Override
	public boolean equals(Object obj) {

		// obj 객체에는 name 멤버가 없으므로 형변환 해야 함.
		if(!(obj instanceof Person)) return false;
		Person p = (Person)obj;
		
		// 나 자신(this)의 이름과 나이를 p와 비교
		return this.name.equals(p.name) && this.age == p.age;
	}
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return name +":"+ age;
	}
}
profile
Enjoy to study

0개의 댓글