개체 (BookMe)의 hashcode 메서드를 재정의 한 후 아래 코드를 실행하고 있습니다. 목표는 내지도 (해시 맵)에서 키로 사용할 객체의 해시 코드를 재정의하는 것입니다. 하지만, 실행 후 null 값을 참조하십시오. 지도의 실제 크기에는 아무런 문제가 없습니다. 아래는 코드입니다. 해시 코드 메서드를 재정의하지 않으면 올바른 출력을 얻습니다. (나는 세 가지 값 모두를 의미합니다). `해시 코드 메서드를 재정의하는 동안 hashmap에서 올바른 값을 가져올 수 없습니다.
class BookMe{
private String isbn ;
static int i = 0;
public BookMe(String isbn)
{
this.isbn = isbn;
}
public String getIsbnValue()
{
return this.isbn;
}
@Override
public boolean equals(Object o)
{
if(o instanceof BookMe && ((BookMe)o).getIsbnValue() == this.getIsbnValue())
{
return true;
}
else{
return false;
}
}
@Override
public int hashCode()
{
return this.isbn.toString().length() + (++i);
}
}
공용 클래스 HashMapTest는 {
public static void main(String[] args) {
Map<BookMe, Integer> map = new HashMap<BookMe, Integer>();
BookMe b1 = new BookMe("Graham");
BookMe b2 = new BookMe("Graham");
BookMe b3 = new BookMe("Graham");
map.put(b1, 19);
map.put(b2, 33);
map.put(b3, 22);
System.out.println("----444444--------");
System.out.println(map.size());
Set <BookMe> set = map.keySet();
System.out.println("------*****------");
for(BookMe bk : set)
{
System.out.println("bk : "+ bk);
System.out.println(map.get(bk));
}
}
} `
정적 필드를 수정하고이를 사용하여 반환 된 해시 코드에 영향을줍니다. 즉, 같은 객체가 반복 호출에서 동일한 해시 코드를 제공하지 않습니다. 그것은 해시 코드로서 완전히 쓸모가 없습니다. – khelwood
이것은 문제의 가능한 원인입니다.'(BookMe) o) .getIsbnValue() == this.getIsbnValue()'. 자세한 설명은 Q & A를 참조하십시오. –
@Stephen ... 변경했습니다. 오류를 이해했으며, 간과 된 코드 오류가 있으며 "같음"으로 수정했습니다. 그건 내 주장이 아닙니다. Eran의 회신에서 제 3의 코멘트를 참조하십시오. – MKod