-2

이 질문에는 이미 답변이 있습니다.

인터뷰에서 해시 코드 및 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;
    }
    }


  • 이러한 값 중 하나가 null이면 어떻게됩니까? equals ()에 전달 된 객체가 Emp의 인스턴스가 아닌 경우 어떻게됩니까? - Kevin Workman
  • buttonoverflow.com/a/113600/3850595 - Jordi Castilla
  • @KevinWorkman 그래, 내가 그 상황을 생각하지 않았다는 것에 동의한다. 내가 어떻게 이런 상황을 스스로 처리 할 수 있는지 조언 해 주시겠습니까? - ndsfd ddsfd

2 답변


2

당신이 사용하고있는 것 :

  • String#hashCode호출 알고리즘은 논쟁 중이다.이리흥미있는 실을 위해
  • 급여를 (예 :int!!) 마지막 부분을 위해
  • 마지막으로 그리고 가장 중요한 것은,씨를 뿌리다: 각 필드에 소수를 곱하고 그 결과를 합한다.

IDE가 해시 코드를 자동 생성하여 더 좋은 아이디어를 얻는 방법을 살펴볼 수 있습니다.

Eclipse에서 :

  • 소스 (또는alt-shift-S)
  • Source
  • Generate 'hashCode()' and 'equals()'...


1

그냥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그것은 다르다. 위의 예를 사용하여 시도해 볼 수 있습니다.


  • 이것은 인터뷰 질문 이었으므로 면접관은 직접 코딩 된 간단한 해결책을 찾고있었습니다. 필요한 외부 라이브러리를 사용하고 있는지 확실하지 않습니다. - Andrew Fielden
  • @ AndrewFielden : 나는 그 사실을 깨닫고 몇 가지 세부 사항을 추가했습니다. - Sanjay T. Sharma

연결된 질문


관련된 질문

최근 질문