11-37~38 HashSet(2)


  • HashSetオブジェクトを保存する前に、既存のオブジェクトが同じかどうかを確認します.
    (同じオブジェクトがない場合は保存します.ある場合は保存しません.)
  • How? boolean add(Object o)内部に格納するオブジェクトのequals()とhashCode()を呼び出すことで、重複するかどうかを決定します.
    (オブジェクトクラスのメソッド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;
    	}
    }