내가이 일 현장 더블 [] _myField 그것의 해시 코드를 가진 개체는자바 대해서 Arrays.hashCode() 이상한 behaivor
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(_myField);
return result;
}
그러나입니다 이상한 행동 다음 문이 true이면 내가 그 위 생각할 수
for (Map.Entry<MyObject, String> entry: _myMap.entrySet())
{
if (entry.getValue() != _myMap.get(entry.getKey()))
{
System.out.println("found the problem the value is null");
}
}
유일한 이유는 내가 키에 대해 다른 해시 코드를 얻을 수 있다는 것입니다.
실제로 모든 경우에 1을 반환하도록 hashcode 함수를 변경했습니다. 효율적이지는 않지만 디버깅에 좋으며 실제로 IF 문은 항상 거짓입니다.
Arrays.hashcode()의 문제점은 무엇입니까?
Pls note (일부 의견을 읽은 후) : 1) IF 문에서! =의 사용법은 실제로 참조를 비교하지만 위의 경우에는 동일해야합니다. 어쨌든 괴괴 망측 한 것은 오른쪽이 NULL을 돌려 준다는 것입니다. 2) 게시 동등 함수. 물론 그것을 구현했습니다. 그러나 그것은 부적절합니다. 디버그에서 코드를 추적하면 해시 코드 만 호출된다는 것을 알 수 있습니다. 그 이유는 아마도 이상한 것일 것이고 반환 된 해시 코드는 원래의 해시 코드와 다릅니다. 이 경우 Map은 일치하는 항목을 찾지 않으므로 Equals를 호출 할 필요가 없습니다.
MyObject.equals() 구현을 게시 할 수도 있습니까? –
나는 그것이 부적절 할 수있다. 디버그 모드에서 추적 할 때 해시 코드 함수가 호출되어 원본과 다른 해시 코드를 생성했기 때문입니다. 자바 맵 구현이 equals를 호출하지 않는다는 것을 감안할 때. 꼭 필요한 것은 아니었다. – Dudi
흥미 롭습니다! 문제를 스스로 재현하기에 충분한 코드를 게시 할 수 있습니까? –