2009-07-22 3 views
5

equals() 메소드 (및 그와 관련하여 compareTo() 메소드)는 성능이 높은 핫스팟이 될 수 있습니다 (예 : 트래픽이 많은 경우) HashMap. 나는 사람들이 필요하다고 증명할 때 이러한 방법을 최적화하기 위해 어떤 트릭을 채택했는지 궁금합니다.equals() 메소드의 최적화

public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    ... 
} 

다른 당신이 좋은 수행 equals() 방법 작성을위한 가이드 라인이 될 수 가로 질러 온 :

예를 들어 IntelliJ IDEA는 다음 생성?

답변

14

가능한 한 빨리로 equals()

  • 실패에 반드시 국한되지 않는 일부 일반 아이디어. 게시 한 스 니펫과 유사하게 먼저 가장 광범위한 제외 기준으로 시작한 다음 더 세분화되어 메서드가 최대한 빨리 반환 될 수 있습니다.
  • 동등성을 위해 필요한 속성 만 비교하십시오.. 저는 때때로 소수의 속성 만이 실제로 두 개의 클래스 인스턴스가 동일하다는 의미 론적 역할을하더라도 클래스가 제공하는 모든 정보를 비교하는 것을 보았습니다. 이것은 물론 클래스와 디자인에 따라 달라집니다.
  • 가능한 경우 균등 재귀를 피하십시오.. 당신이 비교하는 속성 클래스의 종류에 따라 숨겨진 성능에 영향을 줄 수 있습니다 재귀 적으로 자신 또는 다른 개체에 equals()를 호출하는 상황에 자신을 얻을 수 있습니다 성능 고려 사항 외에도

, 돈 ' t이 평등 재귀, 있는지 확인하기 위해 equals API contract을 잊지 대칭, 이적 및하고 equals()를 오버라이드 (override) 할 경우에 항상뿐만 아니라 hashcode()을 무시할 수 일치.

5

나는 당신이 말한 때문에 당신이 그것의 핵심 부분에 이미 것 같아요 :

을 ... 그들이 필요한 증명합니다.

최적화를위한 일반 규칙을 기억 :

  • 하지하지 않는다

    1. 을 ... 아직
    2. 프로필 내가 그들을 들었어요

    을 최적화하기 전에 몇 년 전에 수업을 마치면 C2이라고 할 수 있습니다.

  • 2

    Joshua Bloch의 "효과적인 Java"라는 책 제목을 확인하십시오. 여기에는 몇 가지 놀라운 팁과 전체 섹션이 있습니다. 행운을 빕니다!

    1

    string interning에서 큐를 가져올 수 있습니다.

    개체가 불변 인 경우 정적 팩터 리 방법을 사용하고 고유 인스턴스를 해시 테이블에 채우는 방식으로 자신의 "인터 워킹"을 구현할 수 있습니다. 이렇게하면 참조가 동일하면 객체가 동일 해집니다.

    +0

    동일한 값으로 호출 할 때 해시 테이블에서 동일한 인스턴스를 제거하는 팩토리 메서드를 언급해야합니다. – devgeezer

    +1

    '인턴하기'에주의해야합니다. 잘못 수행되면 성능 문제 및 저장소 누수가 발생할 수 있습니다. String.intern() 호출은 나쁜 생각 일 수 있습니다. –

    +0

    다음은 유의해야 할 좋은주의 사항입니다. Equals (...)가 용납 할 수 없을만큼 오랜 시간을 보냈다는 확실한 증거가 없다면 최적화에 대한 조언이 다른 곳에서 일반적으로 보일 것이라고 생각합니다. – devgeezer

    1

    개체가 자신의 컴퓨터에서 equals()을 호출하는 것을 완전히 제어 할 수있는 환경에있는 경우 수행중인 비교의 종류를 추적하고 equals() 메서드를 적절하게 조정해야합니다.

    당신은 그 특정 시나리오는 결코 일어나지 않을 확인 할 수 있습니다, 그래서 같은 equals() 내에서 코딩 할 필요가 없습니다 :

    • 자기
    • 을 비교 다른 유형
    • 을 비교 null
    • 비교

    수행하는 검사에 적합한 순서를 결정하고 가장 일반적인 실패 원인 인 전나무를 확인할 수도 있습니다 성.

    0

    HashMap을 더 크게 만드는 것이 비쌉니다 (예 :로드 요소를 줄임으로써). 그렇게하면 충돌이 줄어들고 잘하면 (true)를 반환하면 가장 자주 일치합니다.