머리말
우리 모두 알다시피, java.lang.object는 소프트웨어 설계에서 중요한 역할을하는 hashcode () 및 equals () 메소드를 가지고 있습니다. 일부 클래스 에서이 두 가지 방법을 다시 작성하여 몇 가지 중요한 기능을 수행하십시오.
1. 왜 hashcode ()를 사용합니까?
세트 세트의 요소는 무질서하고 반복 할 수 없습니다. 그렇다면 두 요소가 반복되는지 판단하는 기초는 무엇입니까?
어떤 사람들은 다음과 같이 말합니다 : Object.equal() 물론 객체가 동일인지 비교하는 데 사용됩니다. 그러나 세트에는 많은 객체가 있으며, 세트 세트에 추가 된 객체 요소의 비교 수는 점차 증가하여 프로그램 작동의 효율을 크게 줄입니다. Java는 해싱 알고리즘 (해싱 알고리즘이라고도 함)을 사용 하여이 문제를 해결합니다. 객체 (또는 데이터)는 특정 알고리즘에 따라 주소에 직접 매핑되며 객체의 액세스 효율이 크게 향상됩니다.
이러한 방식으로, 다수의 요소를 포함하는 세트가 요소 (개체)를 추가해야 할 때 먼저이 요소의 hashcode ()를 호출하면이 요소의 실제 저장 위치를 한 번에 배치 할 수 있습니다. 이 위치에 요소가 없으면이 객체가 컬렉션 세트에 처음으로 저장되고 객체 가이 위치에 직접 저장됨을 의미합니다. 이 위치에 객체가있는 경우 Equal ()을 호출하여 두 객체가 동일했는지 확인하십시오. 마찬가지라면 요소를 버리고 존재하지 않습니다. 동일하지 않은 경우 다른 주소에 해시.
또한 세트 세트가 객체 유형 데이터를 저장할 때 객체의 hashcode () 메소드를 다시 작성할뿐만 아니라 equals () 메소드를 다시 작성 해야하는 이유입니다.
2. hashcode ()를 어떻게 사용합니까?
hashcode ()와 equals ()의 반환 값 사이의 관계
여기 예입니다. 실제 소프트웨어 개발에서는이 두 가지 방법을 다시 작성하는 것이 가장 좋습니다.
공공 클래스 직원 {int EmployeeId; 문자열 이름; @override public boolean equals (object obj) {if (obj == this) true; 직원 EMP = (직원) OBJ; if (EmployeeId.equals (emp.getemployeeid ()) && name == emp.getName ()) true; 거짓을 반환합니다. } @override public int hashcode () {int hash = 1; 해시 = 해시 * 17 + EmployeeiD; 해시 = hash * 31 + name.hashcode (); 해시를 반환; }}equals () 및 hashcode () 메소드는 특히 동일한 클래스에 객체를 저장하기 위해 컨테이너에 동일한 클래스 객체를 저장할 때 동일한 클래스에서 비교하는 데 사용됩니다.
여기서는 먼저 문제를 이해해야합니다.
equals ()가 같은 두 개의 객체, hashcode ()가 같고 동일하지 않아야합니다. 다시 말해, () 메소드가 동일하지 않은 두 개체의 경우 hashcode ()가 같을 수 있습니다.
여기서 해시 코드는 사전에서 각 문자의 색인과 같으며, Equals ()는 사전에서 동일한 문자 아래 다른 단어를 비교하는 것과 같습니다. 사전에서와 마찬가지로, 사전에서 "자기"라는 단어 아래에서 "자기"와 "자발적"이라는 두 단어를 검색하면, equals ()가 단어 쿼리의 평등을 결정하는 데 사용되면 동일한 단어입니다. 예를 들어, equals ()에 의해 비교 된 두 단어는 "self"이며, hashcode () 메소드에 의해 얻은 값은 현재 동일해야합니다. equals () 메소드가 "자기"와 "자발적"이라는 단어를 비교하면, 결과는 기다리지 않기를 원하지만이 두 단어는 "self"라는 단어에 속하며 색인을 검색 할 때, 즉 hashcode ()가 동일합니다. equals ()가 "자기"와 "그들"이라는 단어를 비교하면 결과도 다르며 hashcode ()에 의해 얻은 결과도 현재 다릅니다.
반대로 : hashcode ()는 다르고 equals ()를 도입 할 수 있습니다. hashcode ()는 동일하며, equals ()는 같거나 같지 않을 수 있습니다.
객체 클래스에서 hashcode () 메소드는 로컬 메소드이며 객체의 주소 값을 반환합니다. 객체 클래스의 equals () 메소드는 두 객체의 주소 값을 비교합니다. equals ()가 같으면 두 객체의 주소 값도 동일하다는 것을 의미합니다. 물론 hashcode ()는 동일합니다.
동등한 요소를 비교하는 것이 더 정확하기 때문에 왜 hashcode () 메소드를 사용하는 이유는 무엇입니까?
해시 알고리즘은 요소를 찾는 데 고효율을 제공하기 때문에 컬렉션에 객체가 포함되어 있는지 여부를 찾으려면 근사 프로그램 코드를 작성하는 방법을 찾으려면?
당신은 일반적으로 각 요소를 하나씩 꺼내서 찾고있는 객체와 비교합니다. Equals 메소드의 결과를 찾으면 요소와 원하는 객체 간의 비교가 검색을 중지하고 긍정적 인 정보를 반환하십시오. 그렇지 않으면 부정적인 정보를 반환합니다. 컬렉션에 10,000 개의 요소와 같은 요소가 많이 있고 원하는 객체가 포함되어 있지 않은 경우 프로그램이 컬렉션에서 10,000 개의 요소를 꺼내어 하나씩 비교하여 결론을 내려야한다는 것을 의미합니다.
객체 클래스는 각 Java 객체의 해시 코드를 반환하기 위해 hashcode () 메소드를 정의합니다. Hashset Collection에서 객체를 찾을 때 Java 시스템은 먼저 물체의 hashcode () 메소드를 호출하여 객체의 해시 코드 테이블을 얻은 다음 해시를 기반으로 해당 스토리지 영역을 찾은 다음 스토리지 영역에서 각 요소를 얻고 Equals 메소드의 객체와 비교합니다. 이런 식으로 컬렉션의 모든 요소를 가로지 않고 결론을 얻을 수 있습니다. 해시 세트 컬렉션에는 우수한 객체 검색 성능이 있음을 알 수 있습니다.
그러나 해시 세트 컬렉션에 객체를 저장하는 효율은 상대적으로 낮습니다. 해시 컬렉션에 객체를 추가 할 때 객체의 해시 코드를 먼저 계산해야하고 컬렉션의 객체의 저장 위치 가이 해시 코드를 기반으로 결정되기 때문입니다. 클래스의 인스턴스 객체를 해시 세트에 정상적으로 저장할 수 있도록이 클래스의 두 인스턴스 객체의 결과는 equals () 메소드와 비교할 때 동일해야합니다. true:obj1.hashCode() == obj2.hashCode() obj1.equals(obj2)
다시 말해 : 객체의 평등 메소드를 다시 작성하면 해시 코드 메소드를 다시 작성해야합니다. 해시 코드 메소드를 다시 작성하지 않으면 객체 객체의 해시 코드 메소드는 항상 객체의 해시 주소를 반환 하며이 주소는 결코 같지 않습니다. 따라서이 시점에서 동등한 메소드가 다시 작성 되더라도 해시 코드 메소드가 대기하고 싶지 않으면 비교를위한 동등한 메소드를 호출하지 않으므로 의미가 없기 때문에 특정 효과가 없습니다.
대부분의 데이터 구조는 Equals 메소드를 사용하여 요소가 포함되어 있는지 여부를 결정합니다.
목록 <string> list = arrays.aslist ( "a", "b", "c"); 부울은 = list.contains ( "b");
이 변수에는 결과가 포함되어 있지만 "B"는 다른 인스턴스이지만 (또한 문자열 상주는 무시되지만) 동일하기 때문에 결과가 포함됩니다.
인스턴스에 포함 된 각 요소를 비교하는 대신 빠른 방법 (잠재적 인스턴스 평등 감소)을 사용하는 방법을 사용합니다. 빠른 비교는 다음 측면을 비교하면됩니다.
바로 가기 비교는 해시 값을 비교함으로써 인스턴스를 정수 값으로 바꿀 수 있음을 의미합니다. 동일한 해시 코드를 가진 인스턴스가 반드시 같을 필요는 없지만 평등을 가진 인스턴스는 동일한 해시 값을 가져야합니다. 이 데이터 구조는 종종이 기술에 의해 명명되며 해시가 가장 유명한 대표자 인 해시에 의해 식별 될 수 있습니다.
그들은 일반적으로 다음과 같이 작동합니다.
요소를 추가 할 때 해시 코드는 내부 배열의 인덱스 (즉, 소위 버킷)를 계산하는 데 사용됩니다.
그렇다면, 불평등 한 요소는 동일한 해시 코드를 가지고 있으며, 예를 들어 목록에 추가하여 동일한 버킷에 묶여 함께 묶여 있습니다.
인스턴스가 작동하는 경우 해시 코드는 버킷 값 (인덱스 값)을 계산하는 데 사용되며 인스턴스는 해당 인덱스 값에 요소가 존재하는 경우에만 비교됩니다.
따라서 해시 코드는 객체 클래스에 정의됩니다.
해시 코드가 동등성을 결정하기 위해 바로 가기로 사용되는 경우, 우리가 관심을 가져야 할 것이 하나뿐입니다. 동일한 객체는 동일한 해시 코드를 가져야하므로 Equals 메소드를 무시하면 해시 코드 구현을 만들어야합니다!
그렇지 않으면 동일 객체에 동일한 해시 코드가 없을 수 있습니다. 왜냐하면 객체의 기본 구현을 호출하기 때문입니다.
공식 문서에서 인용합니다
해시 코드 일반 컨벤션 :
Java 응용 프로그램에서 실행되는 동일한 객체를 호출 할 때 해시 코드 메소드는 항상 동일한 정수를 반환해야합니다. 이 정수는 다른 Java 응용 프로그램에서 일관성을 유지할 필요가 없습니다. equals(Object) 메소드에 따르면 두 객체가 같으면 두 객체가 해시 코드 메소드를 호출하는 경우 동일한 결과를 생성해야합니다.
equals(Object) 메소드에 따르면 두 객체가 같지 않은 경우 해시 코드 메소드를 호출한다고해서 반드시 다른 정수 결과를 생성 할 필요는 없습니다. 그러나 프로그래머는 불평등 한 물체에 대해 다른 정수 결과를 생성하면 해시 테이블의 성능이 향상 될 수 있음을 인식해야합니다.
해시 코드 구현
다음은 person.hashcode() 의 간단한 구현입니다.
@overridepublic int hashcode () {return objects.hash (FirstName, lastName);}Person 's는 여러 필드를 결합하여 해시 코드를 계산합니다. 모두 객체의 해시 함수에 의해 계산됩니다.
필드를 선택하십시오
그러나 어떤 분야가 관련되어 있습니까? 요구 사항은이 질문에 답하는 데 도움이됩니다.
동일한 개체에 동일한 해시 코드가 있어야하는 경우 계산 된 해시 코드에는 평등 검사에 사용되지 않은 필드가 포함되어 있지 않아야합니다. (그렇지 않으면, 두 객체는이 필드가 다르지만 여전히 동일 할 수 있지만이 시점에서 두 객체의 해시 코드는 다를 수 있습니다.) 따라서 해시 그룹 필드가 동일 할 때 사용 된 필드의 하위 집합. 동일한 필드가 기본적으로 사용되지만 고려해야 할 몇 가지 세부 사항이 있습니다.
요약
해시 코드를 계산하는 것은 동일한 정수 값을 압축하는 것임을 이해합니다. 동일한 객체는 동일한 해시 코드를 가져야하며 성능 고려 사항을 위해서는 동일한 해시 코드를 가능한 한 동일한 해당 객체를 공유하는 것이 가장 좋습니다.
즉, Equals 메소드가 다시 작성되면 해시 코드 메소드를 다시 작성해야합니다.
해시 코드를 구현할 때, Equals (또는 Equals에 사용되는 필드의 서브 세트)에 사용 된 것과 동일한 필드를 사용합니다.
돌연변이 가능한 필드를 포함하지 않는 것이 가장 좋습니다. 컬렉션을 위해 해시 코드를 호출하는 것을 고려하지 마십시오. 특수 입력 특정 모드가 없으면 일반 해시 알고리즘을 사용해보십시오.
좋아, 위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.