메소드의 정확한 구현
메소드도 구현해야합니다. 이유와 방법을 올바르게 구현하는 방법을 이해합시다. equals
키 포인트 : hashCode
equals
를 구현할 때 메소드에 사용 된 동일한 필드를 사용해야합니다. 이로 인해 성능 문제가 발생할 수 있으므로 변이 가능한 필드 및 컬렉션을 사용하지 마십시오.
hashCode
및
메소드equals
hashCode
메소드를 사용하여 요소가 포함되어 있는지 확인합니다. 예를 들면 : hashCode
는 사실입니다. equals
contains
비교없이 이상적으로는 거의 필요하지 않을 수 있습니다.
contains
메소드가 동등성을 결정하기 위해 바로 가기로 사용되면, 우리가 실제로 신경 쓰야 할 것은 하나뿐입니다. 동일한 개체는 동일한 해시 코드를 가져야합니다. equals
구현을 만들어야하는 이유입니다! 그렇지 않으면, 우리의 구현에 따라 동일한 것들은 equals
클래스의 구현을 사용하기 때문에 동일한 해시 코드를 가질 수 있습니다. hashCode
Object
메소드 계약
인용 소스 코드 :
메소드에 따라 두 객체가 동일하면 메소드에 대한 호출은 두 객체 각각에서 동일한 정수 결과를 생성해야합니다. hashCode
메소드를 호출 할 필요가 없습니다. 그러나 프로그래머는 불평등 한 객체에 대해 다른 정수 결과를 생성하면 해시 테이블의 성능을 향상시킬 수 있음을 알아야합니다. equals
hashCode
Object
hashCode
구현
필드를 선택하십시오
그러나 어떤 필드가 관련되어 있습니까? 이러한 요구 사항은 다음과 같은 질문에 대답하는 데 도움이됩니다. 동일한 객체에 동일한 해시 코드가 있어야하는 경우 해시 코드 계산에는 평등 점검에 사용되지 않은 필드가 포함되어 있지 않아야합니다. (그렇지 않으면,이 필드에서 다른 두 개의 객체만이 같지만 해시 코드가 다릅니다.) 따라서 해싱에 사용되는 필드 세트는 평등에 사용되는 필드 세트의 하위 집합이어야합니다. 기본적으로 둘 다 동일한 필드를 사용하지만 고려해야 할 몇 가지 세부 사항이 있습니다.
일관성 우선, 일관성 요구 사항이 있습니다. 그것은 상당히 엄격하게 해석되어야합니다. 일부 필드가 변경되면 해시 코드가 변경 될 수 있지만 (종종 변이 가능한 클래스에서는 불가피 함) 해시 데이터 구조는이 시나리오에 대한 준비가되어 있지 않습니다.
위에서 본 것처럼 해시 코드는 요소의 버킷을 결정하는 데 사용됩니다. 그러나 해시 관련 필드가 변경되면 해시가 다시 계산되지 않고 내부 배열이 업데이트되지 않습니다.이것은 동일한 객체를 사용하거나 동일한 인스턴스를 사용하는 후속 쿼리가 실패한다는 것을 의미합니다! 데이터 구조는 현재 해시 코드를 계산하고 (인스턴스를 저장하는 데 사용되는 해시 코드와 달리) 잘못된 버킷에서 찾습니다.
결론 : 해시 코드 계산에 가변 필드를 사용하지 않는 것이 가장 좋습니다! 성능 해시 코드가 계산되는 횟수는 메소드가 호출되는 횟수와 대략 동일 할 수 있습니다. 이는 코드의 중요한 성능 부분에서 발생할 수 있으므로 성능을 고려하는 것이 합리적입니다. 그리고 방법과 달리 최적화를위한 더 많은 공간이 있습니다.
복잡한 알고리즘이 사용되거나 많은 필드가 관련되지 않는 한 해시 코드를 결합하는 산술 비용은 피할 수없는 비용만큼 사소합니다. 그러나 모든 필드가 계산에 포함되어야하는지 고려하십시오! 특히, 세트는 회의적이어야합니다. 예를 들어, 목록과 컬렉션은 각 요소의 해시 값을 계산합니다. 상황에 따라 호출 해야하는지 여부는 상황에 따라 고려해야합니다. 성능이 중요하다면 를 사용하는 것이 최선의 선택이 아닐 수도 있습니다.
그러나 최적화에 대한 일반적인 규칙은 여전히 적용됩니다. 너무 일찍 최적화하지 마십시오! 공통 해시 코드 알고리즘을 사용하면 포함 세트를 포기하고 최적화를 포기하면 성능 분석 후에 만 수행되면 개선 가능성이 있음이 밝혀졌습니다. 충돌
성능을 추구하기 위해 모든 노력을 기울이십시오.이 구현은 어떻습니까?
빠르야합니다. 동등한 객체는 동일한 해시 코드를 가질 것이므로 이와 관련하여 괜찮습니다. 보너스로서, 가변 필드가 관여하지 않습니다!
하지만 전에 버킷에 대해 무엇을했는지 기억하십니까? 이렇게하면 모든 인스턴스가 동일한 버킷에 들어갑니다! 이로 인해 일반적으로 모든 요소를 보유하는 링크 된 목록이 발생하여 성능이 매우 나쁩니다. 예를 들어, 각 호출은 링크 된 목록의 선형 스캔을 트리거합니다. equals
따라서 동일한 버킷의 항목 수를 최소화하고 싶습니다! 매우 유사한 객체에서도 매우 다른 해시 코드를 반환하는 알고리즘은 좋은 시작입니다. 구현 방법은 부분적으로 선택된 필드에 따라 다릅니다. 계산에 자세한 내용을 포함할수록 해시 코드가 다를 가능성이 커집니다. 이것은 우리가 성능에 대해 생각하는 것과 정반대입니다. 따라서 너무 많은 또는 너무 적은 필드를 사용하면 성능이 저하 될 수 있습니다. 충돌 방지의 또 다른 부분은 실제로 해시를 계산하는 데 사용되는 알고리즘입니다.
메소드를 호출하는 것입니다. 수동으로 결합 할 수 있습니다. 일반적인 알고리즘은 임의의 숫자로 시작한 다음 다른 숫자 (보통 작은 소수)를 반복적으로 곱한 다음 필드의 해시를 추가하는 것입니다.해시 값을 계산합니다 필드 해시 코드를 계산하는 가장 쉬운 방법은
이것은 오버플로를 유발할 수 있지만, 이것은 Java에서 예외를 유발하지 않으므로 큰 문제는 없습니다. 입력 데이터에 특정 패턴이있는 경우 우수한 해싱 알고리즘조차도 비정상적으로 자주 충돌 할 수 있습니다. 간단한 예로, 점의 x 및 y 좌표를 추가하여 점의 해시 값을 계산한다고 가정 해 봅시다. 이것은 우리가 종종 직선 F (x) = -x의 점을 다루는 것을 깨닫기 전까지는 꽤 좋아요. 이는이 모든 점에서 x y == 0을 의미합니다. 갈등, 많이!
요약
우리는 해시 코드를 계산하는 것이 정수 값으로 평등을 압축하는 것과 같다는 것을 알았습니다. 동등한 객체는 동일한 해시 코드를 가져야하며 성능의 이유로 동일한 해시로 가능한 한 가능한 한 불평등 한 객체를 최대한 공유하는 것이 가장 좋습니다. 암호. hashCode
이것은 메소드를 다시 작성하면 메소드를 항상 다시 작성해야 함을 의미합니다. <code class="language-java">List<string> list = Arrays.asList("a", "b", "c"); boolean contains = list.contains("b");</string></code>구현메소드 :
방법 메소드에 사용 된 것과 동일한 필드 (또는 하위 집합)를 사용하십시오.
가변 필드를 포함하지 않는 것이 가장 좋습니다. 메소드를 호출하지 않는 것을 고려하십시오.
컬렉션에서 입력 데이터의 패턴이 반대되지 않는 한
공통 알고리즘을 사용하십시오. 방법은 성능과 관련이 있으므로 성능 분석에서 필요하다는 것을 보여주지 않으면 너무 많은 에너지를 낭비하지 마십시오.
Java메서드 (FAQ) 를 구현하는 올바른 구현에 대한
Java의FAQ Java에서 equals
방법의 중요성은 무엇입니까?hashCode
메소드는 정수 값을 반환하는 내장 함수입니다. 주로 해시 기반 컬렉션 (예 : ,
메소드는 각 객체에 고유 식별자가 있는지 확인하기 위해 메소드와 함께 작동합니다. 이를 통해 특히 대규모 컬렉션에서 데이터를 신속하게 검색하여 Java 응용 프로그램의 성능을 향상시킵니다.hashCode
및 )에 사용되어 개체를보다 효율적으로 저장하고 검색합니다.
메소드는 Java에서 어떻게 작동합니까?
java의hashCode()
메소드는 객체의 메모리 주소를 나타내는 정수 값을 생성하여 작동합니다. 이 값은 해시 기반 컬렉션에서 객체의 색인 번호로 사용됩니다. 객체에서 메소드를 호출하면 해싱 알고리즘을 사용 하여이 고유 한 정수를 생성합니다. 그러나 두 개의 다른 객체가 동일
Java의 에서hashCode()
(해시 충돌이라고 불리는 동일)를 가질 수 있음에 주목하는 것이 중요합니다.hashCode()
자바에서 hashCode 방법 사이의 협약은 무엇입니까?equals()
와hashCode()
방법 사이의 협약은 상호 작용을 관리하는 데 사용되는 일련의 규칙입니다. 컨벤션에 따르면 두 개의 객체가 메소드에 따라 동일하면 메소드에 대한 호출은 두 객체 각각에 대해 동일한 정수 결과를 생성해야한다고 명시되어 있습니다. 이를 통해 해시 기반 컬렉션에 객체를 저장하고 검색 할 때 일관성과 정확성을 보장합니다.해시 충돌은 메소드가 두 개의 다른 객체에 대해 동일한 정수를 생성한다는 것을 의미합니다. 제대로 처리되지 않으면 데이터 손실로 이어질 수 있습니다. 해시 충돌을 피하기 위해 해시 알고리즘을 개선하여 고유 한 정수를 생성 할 수 있습니다. 또한 더 큰 소수를 승수로 사용하면 세트에 해시 코드를보다 균등하게 분배하는 데 도움이 될 수 있습니다.
Java에서 equals()
메소드를 다시 작성하는 방법은 무엇입니까?hashCode()
Java 메소드에서 equals()
를 다시 작성하려면 각 객체마다 고유 한 정수를 반환하는 자신의 구현을 제공하는 것이 포함됩니다. 이는 객체 및 프라임 승수의 인스턴스 변수를 사용하여 달성 할 수 있습니다. 소수는 세트에 해시 코드를 골고루 분포하여 해시 충돌 가능성을 줄이는 데 도움이됩니다.hashCode()
해시 충돌이란 무엇이며 피하는 방법은 무엇입니까? 왜
rewritehashCode()
메소드를 다시 작성해야합니까?메소드는 특히 대형 컬렉션을 다룰 때 Java 응용 프로그램의 성능을 향상시킬 수 있습니다. 고유 한 구현을 제공함으로써보다 독특하고 균등하게 분산 된 해시 코드를 생성하여 해시 충돌 가능성을 줄이고 데이터 검색이 더 빨라질 수 있습니다.
예, Java에서는 두 개의 불평등 한 물체가 동일 할 수 있습니다. 이것을 해시 충돌이라고합니다. 그러나 해싱 알고리즘을 개선하고 더 큰 소수를 승수로 사용함으로써 이러한 발생 가능성을 줄일 수 있습니다.hashCode()
Java에서는 두 개의 불평등 한 물체가 동일 할 수 있습니까?메소드를 다시 작성하지 않으면 어떻게됩니까?
메소드를 재정의하지 않으면 Java는 기본 구현을 사용하여 각 객체에 고유 한 해시 코드를 제공하지 않을 수 있습니다. 이로 인해 해시 기반 컬렉션에서 해시 충돌과 데이터 검색이 느려질 수 있습니다. Java 응용 프로그램의 성능을 향상시키는 방법은 무엇입니까?
메소드는 각 객체에 고유 식별자를 제공하여 Java 응용 프로그램의 성능을 향상시킵니다. 이렇게하면 해시 기반 컬렉션에서 데이터를 더 빨리 검색 할 수 있습니다. 객체는 전체 컬렉션을 검색하지 않고 객체의 해시 코드를 직접 찾을 수 있으므로 데이터를 찾을 수 있습니다.hashCode()
비 해행 컬렉션에서 hashCode()
메소드를 사용할 수 있습니까?방법은 주로 해시 기반 컬렉션에 사용되지만 해시 기반 컬렉션에도 사용될 수 있습니다. 그러나 해시 기반 컬렉션은 데이터 저장 및 검색을위한 해시 코드에 의존하지 않기 때문에 이점은 덜 분명 할 수 있습니다.
hashCode()
위 내용은 Java의 해시 코드를 올바르게 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!