import java.util.HashMap;

class Name{
    String firstName;
    String lastName;
    
    Name(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }
    // equals메소드 : 통속에 있는 인스턴스와 키를 이용해서 찾으려는 인스턴스가 같은지 확인용
    public boolean equals (Object obj){ 
        if(!(obj instanceof Name))
            return false;
        Name name = (Name) obj;
        if(firstName.equals(name.firstName) && lastName.equals(name.lastName))
            return true;
        else
            return false;
    }
    
    public int hashCode(){
        return firstName.hashCode() + lastName.hashCode();
        //통번호가 중복되면 그 통속에서 또 키에 맞는 자료를 찾기위해
        //equals를 돌려야하기 때문에 통번호 범위 최대한 크게
    }
    
}



public class Hash{
    public static void main(String[] args){
        HashMap<Name, Integer> hash = 
                new HashMap<Name, Integer>();
        
        
        hash.put(new Name("해리", "포터"), new Integer(90));
        // 해리포터 통번호 : firstName.hashCode() + lastName.hashCode()
        // 통번호를 이용해서 통안에 있는 값을 빠르게 참조하게 하는 키 : "해리","포터"
        // ("해리","포터")라는 키를 이용해서 통번호(firstName.hashCode() + lastName.hashCode())를 바로 찾아들어감
        
        
        
        Integer num = hash.get(new Name("해리", "포터"));
        // 키에 맞는 통번호로 갔는데 그통안에 값이 하나면 equals 한번만 돌려서 확인하고 값 리턴
        
        // 통안에 값이 두개면 equals 두번, 세개면 equals 세번 돌림
        
        
        System.out.println("해리 성적 : "+num);
        
        // 통하나당 인스턴스 하나만 가지고 있으면 가장빠른 검색
        
    }
}