이 질문에는 이미 답변이 있습니다.
이것은 hashcode 및 equals 메서드에 대한 내 이해입니다.
- obj1.hashcode == obj2.hashcode (true를 돌려주는 경우)는 obj1.equals (obj2)가 true를 돌려 주어,
- obj1.equals (obj2)가 false를 돌려주는 경우 (true를 돌려주는 경우) obj1.hashcode == obj2.hashcode (false를 돌려 준다)
이 올바른지?
그만큼협약중에서equals()
과hashCode()
이 명령 :
객체가 동일하다고 판단되면 해시 코드절대로 필요한 것*평등하다. 즉,obj1.equals(obj2)
, 그 다음에obj1.hashCode() == obj2.hashCode()
.
객체가아니같으면 해시 코드가 그들 사이에 있어야하는 것에 대한 어렵고 빠른 규칙이 없습니다. 그들할 수 있었다동일한 해시 코드를 반환하지만 이는 여러 가지 오류를 유발할 수 있습니다.
* : 컴파일시 또는 실행시 실제로 "실행"할 수 없으므로 소금으로 복용하십시오. 응용 프로그램의 정확성을 위험에 빠뜨리십시오.equals
/hashCode
사용이 올바르게 구현되지 않은 경우
만약
obj1.hashcode
==obj2.hashcode
(보고true
) 그 때obj1.equals(obj2)
돌아올지도 모른다true
- 두 객체가
equals(Object)
메소드를 호출 한 다음hashCode
두 객체의 각각에 대한 메소드는 반드시 동일한 정수 결과를 생성합니다.- 두 개체가 서로 다른 경우에는 필요하지 않습니다.
equals(java.lang.Object)
메소드를 호출 한 다음hashCode
방법에 두 객체 각각은 별개의 정수 결과를 생성해야합니다. 그러나 프로그래머는 고유 한 불균등 한 객체에 대한 정수 결과는 해시 테이블
그건부정확 한. 에 대한 설명서Object.equals(Object)
이 방법을 확장하기위한 계약에 대한 공식적인 설명이 있습니다. 본질적으로Object.equals
메서드는 두 객체가 실제로 같은 객체인지 확인하는 것입니다. 그러나 종종이 기능을 무시하고 대신 클래스를 'equals
메소드는 두 객체가논리적으로서로 동일합니다 (예를 들어, 두 문자열 인스턴스가 동일한 문장을 나타내는 두 개의 서로 다른 인스턴스).
한편,Object.hashCode()
다음 계약을 지정합니다.
hashCode의 일반 규약은 다음과 같습니다.
- Java 어플리케이션의 실행 중에 같은 오브젝트상에서 2 회 이상 불려 갈 때마다, hashCode 메소드는, 일관되게 동일한 정수를 반환합니다. 객체에 대한 equals 비교가 수정됩니다. 이 정수는 한 애플리케이션 실행에서 다른 애플리케이션 실행으로 일관성있게 유지 동일한 애플리케이션의 실행
- 2 개의 객체가 equals (Object) 메소드로 동일하면, 2 개의 객체의 각각으로 hashCode 메소드를 호출 할 필요가 있습니다. 동일한 정수 결과를 생성합니다.
- equals (java.lang.Object) 메소드로 2 개의 객체가 동일하지 않은 경우, 다음의 hashCode 메소드를 호출 할 필요는 없습니다. 두 객체 각각은 별개의 정수 결과를 생성해야합니다. 그러나 프로그래머는 고유 한 불균등 한 객체에 대한 정수 결과는 해시 테이블.
꽤 현실적이기는하지만, Object 클래스에 의해 정의 된 hashCode 메소드는 별개의 객체에 대해 뚜렷한 정수를 반환합니다. 일반적으로 이것은 객체의 내부 주소를 정수로 변환하여 구현되지만 Java ™ 프로그래밍 언어에서는이 구현 기술이 필요하지 않습니다.
기본적으로 두 개의 서로 다른 객체 (논리적으로 다르거 나 기술적으로 구별되는 객체)할 수있다해시 코드가 어떻게 설계 되었기 때문에 동일한 해시 코드를 가졌지 만해서는 안된다."같음"이되어야합니다. 그러나 두 객체가 서로 같으면절대로 필요한 것동일한 해시 코드를가집니다. 마찬가지로 객체의 해시 코드는 객체 자체가 어떤 식 으로든 변경되는 경우에만 변경 될 수 있습니다.
자세한 내용은 Wikipedia의 기사를 참조하십시오.해시 함수.
equals
/hashCode
, 그리고 이것은 하나의 이해를 말하는 것입니다.equals
/hashCode
. 어떻게 볼 수 없습니까?의문거기에 복제됩니다. - Makotoa.equals(b)
그게 사실이야.a.hashCode() == b.hashCode()
. 이 답변을 읽으면 '이게 맞습니까?'라고 대답 할 수 있습니다. ' 자기 자신에 대한 질문. 당신이 계속해서 대답을한다면 (대답의 깊이는 아래로),칼레드구체적으로이 질문에서 대답 한 논리 문장을 다룹니다. - user289086