이 기사의 주요 내용은 다음과 같이 Java의 해시 코드의 올바른 평가 방법입니다.
객체의 해시 코드를 캐시 할 수있는 해시 목록에 대한 최적화가 있습니다. 해시 코드가 일치하지 않으면 객체의 동등성을 확인하지 않고 다른 객체라고 직접 고려합니다. 해시 코드 (해시 코드)가 동일하면 객체가 동일인지 여부를 감지합니다.
객체에 동일한 해시 코드 (해시 코드)가 있으면 동일한 해시 버킷에 매핑됩니다. 해시리스트의 모든 객체의 해시 코드가 동일하면 해시리스트는 링크 된 목록으로 변성되어 쿼리 효율이 크게 줄어 듭니다.
좋은 해시 함수는 일반적으로 "기다리고 싶지 않은 객체에 대해 불평등 한 해시 코드를 생성하는 경향이 있습니다". 이상적으로, 해시 함수는 가능한 모든 해시에 그렇게하기를 원하지 않는 세트의 인스턴스를 골고루 분포해야하지만,이 이상적인 상황을 완전히 달성하는 것은 매우 어렵다. 비교적 간단하고 효과적인 해싱 방법은 다음과 같습니다.
1. result 유형 int의 변수에서 17과 같은 0이 아닌 상수 값을 저장하십시오.
2. 객체의 각 키 도메인 F에 대해 ( Equals 메소드와 관련된 각 도메인을 참조 ) 다음 단계를 완료하십시오.
result = 31 * result + c; 곱셈 작업은 더 나은 해시 기능을 얻는 것입니다. 예를 들어, 문자열의 해시 함수가 곱셈을 생략하면 알파벳 순서가 다른 모든 문자열은 동일한 해시 코드를 갖습니다. 31이 여기서 선택된 이유는 홀수 소수이기 때문입니다. 승수가 균일 한 숫자이고 곱셈이 오버플로되면 2 곱하기가 변위와 동일하기 때문에 정보가 손실됩니다. 소수를 사용하는 이점은 분명하지 않지만 해시 결과는 해당 결과를 계산하는 데 일반적으로 사용됩니다. 31은 좋은 기능, 즉 곱셈 대신 시프트와 뺄셈을 사용하여 더 나은 성능을 달성 할 수 있습니다. 31 * i == (i << 5) -i. 오늘날의 VMS는이 최적화를 자동으로 구현할 수 있습니다.클래스가 불변 (모든 도메인이 최종 수정이고 모든 도메인이 기본 유형이거나 불변 클래스)이라면 해시 코드 계산의 오버 헤드도 비교적 높으면 객체 내부의 해시 코드를 고려해야합니다.
공개 클래스 Hashcodedemo {정적 클래스 해시 코데 클라스 {개인 최종 부울 Bresult; 개인 최종 최종 바이트 바이트 값; 개인 최종 문자 charvalue; 개인 최종 짧은 짧은 값; 개인 최종 int intvalue; 개인 최종 Long -Long -Value; 개인 최종 플로트 플로트 value; 개인 최종 이중 더블 값; 개인 최종 최종 문자열 str; 개인 최종 최종 최종 int [] arrayvalue; // 휘발성은 변수가 최신 비공개 휘발성 int 해시 코드인지 확인하기 위해 매번 메모리에 변수가 저장되고 검색됨을 의미합니다. public hashcodeclass () {bresult = false; 바이트 값 = 1; charvalue = 'a'; shortvalue = 1; intvalue = 1; longValue = 1L; floatValue = 1.0f; DoubleValue = 1.0d; str = getClass (). getName (); ArrayValue = new int [] {1,2,3,4,5}; } @override public int hashcode () {if (hashcode == 0) {// 0 도메인 int 결과의 충돌을 증가시키기 위해 0이 아닌 초기 값을 설정합니다. // 승수가 생략되면 알파벳 순서가 다른 모든 문자열은 동일한 해시 코드 최종 int Hash_code = 31을 갖습니다. 결과 = hash_code * result + (bresult? 1 : 0); 결과 = hash_code * result + bytevalue; 결과 = hash_code * result + charValue; 결과 = hash_code * result + shortvalue; 결과 = hash_code * result + intvalue; 결과 = hash_code * result + (int) (longValue ^ (longValue >>> 32)); result = hash_code * result + float.floattointBits (floatValue); long doublelongvalue = double.doubletolongbits (doublevalue); result = hash_code * result + (int) (DoublelongValue ^ (DoublelongValue >> 32)); 결과 = hash_code * result + (str == null? 0 : str.hashcode ()); System.out.println ( "str =" + str + ", str.hashcode =" + str.hashcode ()); 결과 = hash_code * result + arrayvalue.hashcode (); 반환 결과; } 반환 해시 코드; }} public static void main (String [] args) {hashcodeclass obj = new Hashcodeclass (); System.out.println ( "obj.hashcode =" + obj.hashcode ()); System.out.println ( "obj ="+obj.tostring ()); }}산출
str = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode = -205823051obj.hashcode = 946611167st = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode=-205823051obj=com.demo.test.hashcodedemo$hashcodeclass@386c23df
요약
위의 내용은이 기사에 관한 모든 것이 Java에서 해시 코드의 올바른 평가 방법을 논의하는 것이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!