2013-01-21 2 views
2

equals과 관련하여 HashMap 성능에 관한 질문이 있습니다. 다음과 같이 Null-Check를 먼저 입력하면 다음과 같이 표시됩니다.Java의 HashMap에서 equals의 역할

public boolean equals(final Object obj) { 
    // object must be Test at this point 
    if (obj == null) { 
     return false; 
    } 
} 

그렇지 않은 경우 조금 더 빠릅니다.

그래서 HashMap을 작성하려면 - HashMap에있는 요소와 비교하여 어떤 요소가 있는지 궁금합니다. 삽입, 삽입하거나 가져올 때 나는 결코 어떤 null 개체도 삽입하지 않습니다.

감사합니다.

답변

5

단일 if 문 비용에 대해 심각하게 걱정하지 않아도됩니다. 이는 마이크로 최적화이며 프로그램의 병목 현상임을 입증하지 않은 한 절대적으로 걱정할 필요가 없습니다. 거의 보편적으로 프로그램의 속도 저하는 개별적인 if 문이 아닌 대규모 비효율에 기인합니다.

HashMap에 저장된 개체는 비교할 수 있지만 HashMap은 개체를 비교하려고합니다. 이는 일반적으로 삽입, 삭제 및 조회 중에 수행되어 HashMap이 두 객체가 동일한 지 여부를 알 수 있지만 객체가 다시 흐르도록 수행 될 수 있습니다 (객체가 HashMap을 통해 재배포 됨). 구현은 null에 대한 객체를 비교해보고 메모리 사용을 향상시키기 위해 어떤 종류의 미친 공격적 캐싱 또는 통합 스키마를 수행 할 수도 있습니다. HashMap 계약의 일부로 equals이 귀하의 오브젝트에 대해 작동해야한다는 점을 감안할 때 많은 것을 가정 할 수 없습니다. 또한

, 당신이 equalsnull을 지원하지 않는 경우에, 당신은 명시 적으로 null를 전달하는 false을 반환해야 함을 언급하는 breaking the contract for equals as specified in Object 있습니다. 이미 언급했듯이 병목 현상이 있음을 증명할 수있는 데이터가 없다면 이것은 거의 확실한 아주 나쁜 생각입니다.

희망이 도움이됩니다.

3

정확하게 분기 예측 된 널 (null) 검사는 대부분의 최신 CPU에서 사실상 무료입니다. 진심으로, 당신은 그것에 대해 걱정하지 않아야합니다. 당신이 명시 적으로 널 (null) 검사가 필요하지 않습니다

public boolean equals(final Object obj) { 
    if (obj instanceof MyObject) { 
     // do comparison 
    } else { 
     return false 
    } 
} 

참고 : 다음 else 절 핸들

보통 이런 상황에서 나는 불필요한 널 체크를하게 먼저 instanceof 체크를 넣어 것입니다하지만 같은 방법으로 유효한 MyObject 인스턴스가 아닌 다른 것에 대해서는 false를 반환합니다.