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

이 튜토리얼은 AWS 서비스를 사용하여 서버리스 이미지 처리 파이프 라인을 구축함으로써 안내합니다. ECS Fargate 클러스터에 배포 된 Next.js Frontend를 만들어 API 게이트웨이, Lambda 기능, S3 버킷 및 DynamoDB와 상호 작용합니다. th

CNCF (Cloud Native Computing Foundation), Ampere Computing, Equinix Metal 및 Actuated 간의 공동 작업 인이 파일럿 프로그램은 CNCF Github 프로젝트를위한 ARM64 CI/CD를 간소화합니다. 이 이니셔티브는 보안 문제 및 성과를 다룹니다

이 GO 기반 네트워크 취약점 스캐너는 잠재적 보안 약점을 효율적으로 식별합니다. 속도를 위해 Go의 동시성 기능을 활용하고 서비스 감지 및 취약성 일치를 포함합니다. 그 능력과 윤리를 탐색합시다


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전
