문제
필드 멤버 한 명 (예 : 문자열) 만있는 매우 간단한 클래스가 있습니다. 구현해도 괜찮습니까? hashCode()
단순히 돌아옵니다 fieldMember.hashCode()
? 아니면 어떻게 든 필드의 해시 코드를 조작해야합니까? 또한 조작해야한다면 왜 그런가요?
해결책
Fieldmember가 대상을 고유하게 식별하는 꽤 좋은 방법이라면 예라고 말할 것입니다.
다른 팁
조슈아 블로치 3 장.
곱하기, 추가 또는 xor-ing이 더 독특하게 만들지는 않습니다. 수학적으로, 당신은 단일 변수에 상수 함수를 적용 할 것이며, 이는 변수의 가능한 값의 수를 증가시키지 않습니다.
이러한 종류의 기술은 여러 해시 코드를 결합하고 여전히 충돌 위험을 상대적으로 작게 유지하는 데 유용합니다. 단일 해시 코드에는 아무런 영향을 미치지 않습니다.
예, 그것은 꽤 표준입니다. 클래스가 데이터베이스 행을 반영하면 기본 키를 반환합니다.
두 가지 실제 요구 사항 만 있습니다 hashCode
: 하나, 그 equals
인스턴스에는 동일한 해시 코드가 있으며 두 개는 hashCode
합리적으로 빠르게 실행됩니다. 첫 번째 요구 사항은 실제로 가장 중요한 요구 사항입니다. 그것 없이는 컬렉션에 무언가를 넣을 수 있지만 거기에서 찾을 수는 없습니다. 두 번째는 단순히 성능 문제입니다.
해당 분야의 해시 코드 알고리즘이 위의 부분을 충족하는 경우 해당 클래스가 클래스에도 작동합니다. equals
또한 해당 필드가 있는지에 따라 다릅니다 equals
.
'FieldEmber'변수가 이미 '해시 코드'함수를 구현하면 부모 클래스에서 직접 사용할 수 있습니다. 'Fieldmember'변수가 사용자 정의 클래스 인스턴스 인 경우 직접 올바르게 구현해야합니다. 읽다 java.lang.object '해시 코드'를 구현하기위한 지침으로 API 문서.
당신. 좋은 프로그래밍 연습입니다. 나는 보통 사용합니다 :
반환 var ^ 1;
일반적 으로이 객체를 *해시 맵 또는 *해시 세트의 요소의 키로 사용하지 않는 한 hashcode ()를 재정의 할 필요가 없습니다.
다른 사람이 언급했듯이 효과적인 Java의 조언을 따라야합니다. hashcode () 메소드를 무시하면 equals () 메소드를 재정의해야합니다. 또한 두 가지 방법은 일관성이 있어야합니다.
equals equals () 및 hashcode () 메소드 작성을 단순화하려면 사용합니다. EqualsBuilder 그리고 해시 코드 빌더 Apache Commons Lang에서
예는 다음과 같습니다.
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
User other = (User) o;
return new EqualsBuilder()
.append(this.getUniqueId(), other.getUniqueId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(this.getUniqueId())
.toHashCode();
}