이해하다
Hashcode ()의 목적은 해시 코드라고도하는 해시 코드를 가져 오는 것입니다. 실제로 int 정수를 반환합니다. 이 해시 코드의 기능은 해시 테이블에서 객체의 인덱스 위치를 결정하는 것입니다.
hashcode ()는 JDK의 Object.java에 정의되어 있습니다. 즉, Java의 모든 클래스에는 hashcode () 함수가 포함되어 있습니다.
그러나 각 Java 클래스에는 hashcode () 함수가 포함되어 있습니다. 그러나 클래스의 hashcode ()는 "해시 테이블"( "해시 테이블"에 대한 아래 설명 참조)을 작성하고 만들 때만 유용합니다 (기능은 해시 테이블에서 클래스의 각 객체의 위치를 결정하는 것입니다. 다른 경우 클래스의 단일 객체를 생성하거나 클래스의 객체를 생성하는 등의 hashcode ()는 효과가 없습니다.
위의 해시 목록은 다음과 같습니다. Hashmap, Hashtable 및 Hashset과 같이 본질적으로 해시 목록 인 Java 컬렉션의 클래스.
다시 말해 : hashcode ()는 해시리스트에서만 유용하지만 다른 경우에는 쓸모가 없습니다. 해시 테이블에서 hashcode ()의 함수는 객체의 해시 코드를 얻은 다음 해시 테이블에서 객체의 위치를 결정하는 것입니다.
우리는 모두 해시 테이블이 키 값 쌍을 저장하고 있으며, 이는 "키"를 기반으로 해당 "값"을 빠르게 검색 할 수 있습니다. 해시 코드를 사용합니다!
해시 테이블의 본질은 배열을 통해 구현됩니다. 해시 테이블에서 특정 "값"을 얻으려면 실제로 배열의 특정 위치에서 요소를 가져오고 싶습니다. 배열의 위치는 "키"에 의해 얻어진다; 또한 배열의 위치는 "키"에 해당하는 해시 코드에 의해 계산됩니다.
아래에서는 Hashcode ()의 역할을 깊이 설명하기 위해 해시 세트를 예로들 것입니다.
해시 세트에 이미 1000 개의 요소가 있다고 가정합니다. 1001 번째 요소를 삽입 할 때 어떻게해야합니까? Hashset은 세트 컬렉션이므로 중복 요소가 가능합니다.
"1001 번째 요소를 이전 1000 요소와 하나씩 비교하십시오"? 분명히이 효율은 똑같이 비효율적입니다. 해시 테이블은이 문제를 매우 잘 해결합니다. 해시 코드를 기반으로 해시 테이블의 요소의 위치를 계산 한 다음 해당 위치에 요소를 삽입합니다. 같은 요소의 경우 당연히 하나만 저장됩니다.
이것으로부터 우리는 두 요소가 같으면 해시 코드가 같아야한다는 것을 알 수 있습니다. 그러나 다른 방법은 아닙니다. 해시 테이블에서
1. 두 객체가 같으면 해시 코드 () 값이 동일해야합니다.
2. 두 객체 hashcode ()가 같으면 반드시 같을 필요는 없습니다.
참고 : 해시 테이블의 경우입니다. 이것은 해시가 아닌 목록에서 사실이어야합니다!
예
특정 예를 살펴 보겠습니다.
공개 클래스 해시스트 {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int hashcode () {return i % 10; } public final static void main (String [] args) {hashtest a = new Hashtest (); Hashtest B = New Hashtest (); A. 세트 (1); B.seti (1); <hashtest> set = new Hashset <hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.HashCode ()); System.out.println (a.equals (b)); System.out.println (set); }}이 출력의 결과 :
true false [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
위의 예에서는 해시 코드 메소드를 다시 작성합니다. 위의 결과에서, 우리는 두 객체의 해시 코드가 동일하지만 두 객체는 실제로 같지 않다는 것을 알 수 있습니다. 우리는 Equals 메소드를 다시 작성하지 않았으며, 두 객체의 참조가 동일하고 두 객체의 참조가 동일하고 두 객체의 참조가 확실히 확실하지 않다는 것을 비교하기 위해 객체의 기본값 평등 방법을 호출합니다. 여기에 우리는 생성 된 객체를 해시 세트에 넣고 고유 한 객체 만 해시 세트에 저장 될 수 있습니다.
이 시점에서 우리는 Equals 메소드를 추가합니다.
공개 클래스 해시스트 {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; . } if (object == this) {return true; } if (! (객체 hashtest)) {return false; } hashtest other = (hashtest) 객체; if (other.geti () == this.geti ()) {return true; } false를 반환합니다. } </strong> </span> public int hashcode () {return i % 10; } public final static void main (String [] args) {hashtest a = new Hashtest (); Hashtest B = New Hashtest (); A. 세트 (1); B.seti (1); <hashtest> set = new Hashset <hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.HashCode ()); System.out.println (a.equals (b)); System.out.println (set); }}이 시점에서 얻은 결과는 다음과 같습니다.
진정한 진실 [com.ubs.sae.test.hashtest@1]
결과에서, 우리는 두 객체가 이제 완전히 같고, 하나의 객체 만 해시 세트에 저장되어 있음을 알 수 있습니다.
요약
1. 해시 코드의 존재는 주로 해시 가능, 해시 맵 등과 같은 견해를 검색하는 데 사용됩니다. 해시 코드는 해시 저장 구조에서 객체의 저장 주소를 결정하는 데 사용됩니다.
2. 두 객체가 동일하면 평등 (java.lang.object) 메소드에 적용 할 수 있습니다.이 두 객체의 해시 코드는 동일해야합니다.
3. 객체의 평등 메소드를 다시 작성하면 객체의 해시 코드도 가능한 한 많이 다시 작성해야하며 해시 코드가 사용하는 객체는 동일 메소드와 동일해야합니다. 그렇지 않으면 위에서 언급 한 두 번째 점을 위반합니다.
4. 두 객체의 해시 코드는 동일합니다. 이는 반드시 두 객체가 동일하다는 것을 의미하지는 않습니다. 즉, 반드시 평등 (java.lang.object) 메소드에 적용되는 것은 아닙니다. 이 두 객체는 해시 가능과 같은 해시 저장 구조에 있으며 "동일한 바구니에 저장됩니다"라는 것을 나타냅니다.