먼저 hashCode의 역할을 이해하려면 먼저 Java의 컬렉션을 알아야 합니다.
일반적으로 Java에는 두 가지 유형의 컬렉션이 있습니다. 하나는 List이고 다른 하나는 Set입니다.
그들의 차이점을 알고 있나요? 전자 세트의 요소는 순서가 지정되어 있으며 요소는 반복될 수 있습니다. 후자 세트의 요소는 순서가 없지만 요소는 반복될 수 없습니다.
그렇다면 여기에 더 심각한 문제가 있습니다. 요소가 반복되지 않도록 하려면 두 요소가 반복되는지 여부를 판단하는 기준은 무엇이어야 할까요?
이것이 Object.equals 메소드입니다. 하지만 요소가 추가될 때마다 한 번씩 확인하게 되면 요소가 많아지면 컬렉션에 추가된 요소 간의 비교 횟수가 매우 많아지게 됩니다.
즉, 현재 컬렉션에 1000개의 요소가 있는 경우 1001번째 요소가 컬렉션에 추가되면 equals 메서드가 1000번 호출됩니다. 이는 분명히 효율성을 크게 떨어뜨릴 것입니다.
따라서 Java는 해시 테이블의 원리를 채택합니다. 해시(Hash)는 사실 사람의 이름이다. 그가 해시 알고리즘의 개념을 제안했기 때문에 그의 이름을 따서 명명됐다.
해시 알고리즘이라고도 알려진 해시 알고리즘은 특정 알고리즘에 따라 데이터를 주소에 직접 할당합니다. 해시 알고리즘을 자세히 설명하면 글의 길이가 더 필요하므로 여기서는 소개하지 않겠습니다.
초보자는 hashCode 메소드가 실제로 객체 저장소의 물리적 주소를 반환한다는 것을 이해할 수 있습니다(실제로는 그렇지 않을 수도 있음).
이런 방식으로 컬렉션에 새로운 요소가 추가되면 해당 요소의 hashCode 메소드가 먼저 호출되며, 해당 요소가 배치되어야 하는 물리적 위치를 즉시 찾을 수 있습니다.
이 위치에 요소가 없으면 비교 없이 이 위치에 직접 저장할 수 있습니다.
새 요소와 비교하려면 해당 요소를 호출하면 됩니다. 동일하지 않으면 다른 주소가 해시됩니다.
그래서 여기에는 갈등 해결의 문제가 있습니다. 이런 방식으로, 실제로 equals 메소드를 호출하는 횟수는 거의 한두 번으로 크게 줄어듭니다.
따라서 Java는 eqauls 메소드 및 hashCode 메소드에 대해 다음을 제공합니다.
1. 두 객체가 동일하다면 hashCode 값도 동일해야 합니다. 2. 두 객체의 hashCode가 동일하다고 해서 반드시 동일할 필요는 없습니다. eqauls 방법.
물론 필요에 따라 이를 수행할 필요는 없지만 동일한 개체가 Set 컬렉션에 나타날 수 있다는 것을 알게 될 것입니다. 동시에 새로운 요소를 추가하는 효율성은 크게 감소합니다. 해시코드 방법은 두 객체가 동일한지 여부를 확인하는 데 사용됩니다.
그렇다면 Equals라는 메소드가 있지 않나요? 예, 이 두 가지 방법은 두 개체가 동일한지 여부를 확인하는 데 사용됩니다. 그러나 그들은 다릅니다. 일반적으로 두 객체가 동일한지 확인하려면 사용자가 equals 메서드를 호출합니다.
equals 메서드를 재정의하고 코드에서 호출하여 두 메서드가 같은지 확인할 수 있습니다. 간단히 말해서, equals 메소드는 두 객체가 표면이나 내용에서 동일한지 여부를 확인하는 데 주로 사용됩니다. 예를 들어 학생 수업이 있는데,
유일한 속성은 이름과 성별이므로 이름과 성별이 동일한 한 두 개체는 동일하다고 생각할 수 있습니다. hashcode 메소드는 일반적으로 사용자가 호출하지 않습니다. 예를 들어 hashmap에서는 키가 반복될 수 없기 때문에
키가 반복되는지 판단할 때 해시코드 방식을 판단하고, 동등 방식도 사용했다. 여기서 반복할 수 없는 것은 같음과 해시코드 중 하나가 같지 않으면 괜찮다는 뜻입니다! 간단히 말해서, 해시코드는 파일의 md5와 마찬가지로 객체의 인코딩과 동일합니다. 비교할 때 직관적이지 않은 int 유형을 반환한다는 점에서 동일과 다릅니다. 일반적으로 논리를 일관되게 만들기 위해 같음을 재정의할 때 해시코드를 덮어씁니다. 예를 들어,
지금의 예를 계속 사용하면 이름과 성별이 동일하고 두 개체가 동일하더라도 hashcode 메서드는 이름의 해시 코드 값과 성별의 해시 코드 값도 반환해야 하므로 논리적으로 일관성이 있습니다. .
두 객체가 동일한지 물리적으로 확인하려면 ==를 사용하세요.