728x90

자바 헤쉬코드 hashCode() 의 이해

public class HashCodeTest {
public static void main(String[] ar)
{
String obj1 = new String("헤쉬");
String obj2 = new String("헤쉬");
int hash1 = obj1.hashCode();
int hash2 = obj2.hashCode();

System.out.println(hash1);
System.out.println(hash2); //키객체의 주소가 달라도 같은 값을 가지면 객체의 헤쉬 코드는 같다
//String 클래스에 hashCode()메소드가 오버라이딩 되있기 때문

//키 객체의 값이 같을때 이와 같이 같은 헤쉬코드를 리턴해야
//헤쉬테이블, 헤쉬맵 사용시 제대로된 Key로써 역할을 함
}
}
출력결과
1747208
1747208

Hashtable이나 HashMap에서 Key에 직접만든클래스를 넣을때 주의 할점
hashCode()값을 정확히 계산하는 경우는
클래스 내에 hashCode() 메서드가 오버라이딩 된 경우에만 가능
Name 클래스는 직접만든 클래스라 hashCode()가 오버라이딩 안되어있기 때문에
키로 Name 클래스를 넣어도 제대로된 hashCode를 가져오지 못함

따라서 내가 만든 클래스를 key로 사용하고 싶으면
내가 만든 클래스에 hashCode()가 반드시 오버라이딩 되있어야함

//클래스를 key로 잘못 사용한 예
import java.util.*;
class Name{
String firstName;
String lastName;

public Name(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}

public class HashCodeTest2 {
public static void main(String[] ar)
{
HashMap<Name, Integer> map = new HashMap<Name, Integer>();
map.put(new Name("홍","길동"), new Integer(80));//헤쉬맵의 값은 무조건 객체만
map.put(new Name("유","관순"), 70);//이렇게 쓰는것도 가능
map.put(new Name("장","영실"), 100);

Integer num = map.get(new Name("장","영실"));
System.out.println(num);//출력결과 null이 나옴, 값을 못가져옴, 왜 못가져 옴?
//Key로 사용되는 Name 클래스에 hashCode()메소드가 오버라이딩 안되있어서

Name obj1 = new Name("장","영실");
Name obj2 = new Name("장","영실");

int hash1 = obj1.hashCode();
int hash2 = obj2.hashCode();

System.out.println(hash1);//출력 33492446
System.out.println(hash2);//출력 31952838
//같은 값이 나와야 되나 헤쉬코드 메소드가 Name클래스에 오버라이딩 되있지
//않기 때문에 키값으로 같은 값을 보내도 서로 다른 hashCode값이 나옴

}

}


위 예제의 Name 클래스에 hashCode()와 equals() 을 오버라이딩 하면
제대로된hashCode값을 얻을수 있다

( equals() 는 객체안의 값 비교를 위한 메소드인데 hashCode() 얻기위해 내부적으로 사용 )

//--------------------Name 클래스에 아래 두 메소드 오버라이딩-----------------------
public int hashCode()//hashCode 오버라이딩
{
return firstName.hashCode()+lastName.hashCode();
}
public boolean equals(Object obj)//equals 오버라이딩
{//
if(!(obj instanceof Name))
return false;
Name name = (Name)obj;

if(firstName.equals(name.firstName)&&lastName.equals(name.lastName) )
return true;
else
return false;
}

728x90

'JAVA' 카테고리의 다른 글

자바 한글 UNICODE 변환 (특수문자안됨)  (0) 2013.01.16
자바 한글 unicode 변환 (테스트안해봄)  (0) 2013.01.16
안드로이드 TEXTVIEW 폰트  (0) 2013.01.16
자바 암호화 RSA  (0) 2013.01.16
자바 암호화 RSA2  (0) 2013.01.16

+ Recent posts