이 질문에는 이미 답변이 있습니다.
인터뷰에서 해시 코드 및 equals 메서드의 구현을 효율적인 방식으로 표시하도록 요청 받았기 때문에 아래의 pojo를 구성했지만 인터뷰 담당자는 이것이 충돌을 초래할 수 있으므로 정확하고 최선의 구현이 아니라고 말했습니다. 해시 코드의 구현이 정확하거나 옳은지 조언 해 주실 수 있습니까?
public class Emp {
String name, job;
int salary;
public Emp(String n, String j, int s) {
this.name = n;
this.job = j;
this.salary = s;
}
public int hashcode() {
return name.hashCode() + job.hashCode() + salary;
}
public boolean equals(Object o) {
Emp e1 = (Emp) o;
return this.name.equals(e1.name) && this.job.equals(e1.job) && this.salary == e1.salary;
}
}
당신이 사용하고있는 것 :
String#hashCode
호출 알고리즘은 논쟁 중이다.이리흥미있는 실을 위해int
!!) 마지막 부분을 위해IDE가 해시 코드를 자동 생성하여 더 좋은 아이디어를 얻는 방법을 살펴볼 수 있습니다.
Eclipse에서 :
alt
-shift
-S
)Source
Generate 'hashCode()' and 'equals()'...
그냥hashCode
정말 좋은 생각이 아닙니다. 라이브러리가 있습니다 (예 :롬복 프로젝트) 당신을 위해 이것을하는. 또는 IDE에서 생성하도록 요청할 수도 있습니다. 예 :Eclipse에는 옵션이 있습니다.의 생성hashCode
클래스의 필드를 기반으로합니다.
비트를 추정하려면; 당신이 다음과 같다고 가정 해 봅시다.hashCode
에스:
name.hashCode() = 200
job.hashCode() = 400
salary = 1000000
하지만 당신은 다음과 같은 것을 갖는 또 다른 독특한 종업원을 가질 수도 있습니다.hashCode
에스:
name.hashCode() = 400
job.hashCode() = 200
salary = 1000000
보시다시피, 우리는 여기에 두 명의 다른 종업원이 있긴하지만, 같은 종업원으로 끝납니다.hashCode
모두. 바람직한 특성hashCode
해싱중인 엔티티가 가능한 한 균일하게 배포되도록하는 것입니다.
당신이 모든 "좋은"hashCode
구현에서는 소수의 곱셈에 주목할 것입니다. 이렇게하면 모든 개별 hashCode의 합계가 같아 지더라도 전체hashCode
그것은 다르다. 위의 예를 사용하여 시도해 볼 수 있습니다.