-1

이 질문에는 이미 답변이 있습니다.

이것은 hashcode 및 equals 메서드에 대한 내 이해입니다.

  • obj1.hashcode == obj2.hashcode (true를 돌려주는 경우)는 obj1.equals (obj2)가 true를 돌려 주어,
  • obj1.equals (obj2)가 false를 돌려주는 경우 (true를 돌려주는 경우) obj1.hashcode == obj2.hashcode (false를 돌려 준다)

이 올바른지?


  • 잠깐. 이게 어떻게 중복되는거야? - Makoto
  • @Makoto, 링크 된 Q &A는 정확히 두 계약을 설명합니다. 그래서 이것이 어떻게되는지 모르겠다.아니중복. OP의 질문에 대한 답변이 있습니다. 그러나이 질문을 다시 열어 투표하십시오. - Bart Kiers
  • 글쎄 ... 내가이 질문과 (이전에) 링크 된 사본을 읽은 것에서, 하나는 구현시 함정에 관한 이야기이다.equals/hashCode, 그리고 이것은 하나의 이해를 말하는 것입니다.equals/hashCode. 어떻게 볼 수 없습니까?의문거기에 복제됩니다. - Makoto
  • @Makoto 첫 번째 및 허용 된 대답은 이유를 식별합니다.a.equals(b)그게 사실이야.a.hashCode() == b.hashCode(). 이 답변을 읽으면 '이게 맞습니까?'라고 대답 할 수 있습니다. ' 자기 자신에 대한 질문. 당신이 계속해서 대답을한다면 (대답의 깊이는 아래로),칼레드구체적으로이 질문에서 대답 한 논리 문장을 다룹니다. - user289086
  • @wlstead 문제 없습니다. " 도대체 < 삭제되지 않음 " - 10k + (삭제 된 타겟을 볼 수 있음)에 유용 할만한 것이 있습니다.이 쿼리삭제 된 게시물의 대상인 삭제 된 게시물에 대한 질문을 삭제 취소하거나 (또는 기록에 따라 잠김) 삭제하거나 대상을 재 지정하거나 삭제할 수 있습니다. - user289086

3 답변


1

그만큼협약중에서equals()hashCode()이 명령 :

  • 객체가 동일하다고 판단되면 해시 코드절대로 필요한 것*평등하다. 즉,obj1.equals(obj2), 그 다음에obj1.hashCode() == obj2.hashCode().

  • 객체가아니같으면 해시 코드가 그들 사이에 있어야하는 것에 대한 어렵고 빠른 규칙이 없습니다. 그들할 수 있었다동일한 해시 코드를 반환하지만 이는 여러 가지 오류를 유발할 수 있습니다.

* : 컴파일시 또는 실행시 실제로 "실행"할 수 없으므로 소금으로 복용하십시오. 응용 프로그램의 정확성을 위험에 빠뜨리십시오.equals/hashCode사용이 올바르게 구현되지 않은 경우


  • ' 대회 ' ' 계약하기 ' 그 이상협약일반적으로 파일 구조, 들여 쓰기, 주석, 이름 지정 (getX / setX는 규칙)을 다룹니다. equals와 hashCode 관계는 더 많은 계약입니다.절대로 필요한 것일을 위해이 방법으로 일하십시오. " 계약 " 는 설명의 두 번째 줄에서 구체적으로 사용됩니다. - "hashCode의 일반 계약은 :" - user289086

1

만약obj1.hashcode==obj2.hashcode(보고true) 그 때obj1.equals(obj2) 돌아올지도 모른다true

javadoc에서

  • 두 객체가equals(Object)메소드를 호출 한 다음hashCode두 객체의 각각에 대한 메소드는 반드시   동일한 정수 결과를 생성합니다.
  • 두 개체가 서로 다른 경우에는 필요하지 않습니다.equals(java.lang.Object)메소드를 호출 한 다음hashCode방법에   두 객체 각각은 별개의 정수 결과를 생성해야합니다.   그러나 프로그래머는 고유 한   불균등 한 객체에 대한 정수 결과는   해시 테이블


  • 예, 잠시 동안 거기에 있던 두 번째 진술이 잘못되었다고 생각했습니다 ... - Alnitak

1

그건부정확 한. 에 대한 설명서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의 기사를 참조하십시오.해시 함수.

연결된 질문


관련된 질문

최근 질문