2016-10-18 9 views
0

는 지금은이 자바 코드비교 객체는

import java.util.HashSet; 
import java.util.Objects; 
import java.util.Set; 

public class Dummy { 

    private String value; 

    public Dummy(final String value) { 
     this.value = value; 
    } 

    public boolean equals(final Object that) { 
     return that instanceof Dummy && Objects.equals(value, ((Dummy) that).value); 
    } 

    public int hashcode() { 
     return Objects.hash(value); 
    } 

    public static void main(final String... args) { 
     final Set<Dummy> dummies = new HashSet<>(); 
     dummies.add(new Dummy("toto")); 
     System.out.println(dummies.contains(new Dummy("toto"))); 
    } 
} 

출력은 "거짓 false"가 있고, 나는 단지 하나의 문자를 변경하여 "true"로 변경하기로되어있어,하지만 난이 그걸하는 법을 절대 모르고 ... 어떤 생각? 감사. :)

+0

당신의 해시 코드와 같음은 느슨하게 구현되었습니다 ... –

답변

5

hashcode()는 Object의 메서드는 아니지만 hashCode()는 false입니다.

public int hashcode() { 
     return Objects.hash(value); 
    } 

당신도 고려하지 않는 특별히 때문에

public int hashCode() { 
     return Objects.hash(value); 
    } 
+1

"@Override 추가"를 사용하면 두 가지 방법 모두에서 "더러운"트릭을 즉시 나타낼 수 있습니다. – GhostCat

+0

당신은 맞지만 한 캐릭터 이상입니다 (게임 규칙 ;-)) – davidxxx

+0

"퍼즐"부분에 답하셨습니다. 그래서, 그것은 "OK 응답"을줍니다. 위대한 해답은 "더 많은 관점"을 열려고 시도합니다. 예를 들어 @Override를 사용하면 작은 트릭을 불가능하게 만드는 방법을 추가 할 수 있습니다. 즉, 현실 세계에서 그런 어리석은 실수를 저 지르지 못하게하는 방법입니다. 이제 "OK 응답"에 만족하거나 그 이상을 위해 노력한다면 당신의 선택입니다. ;-) – GhostCat

0
당신이하지 적절한 방법으로 등호 및 해시 코드를 구현하는 때문에 세트가 작동하지

...

  1. 을해야한다 문자열 필드
  2. 사용자가 오버라이드를 피하는 이유는 사용자가 잘못된 방법 인 hashco에 대한 힌트가 될 것입니다. 드해시 코드

당신이 IDE에서

@Override 
    public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((value == null) ? 0 : value.hashCode()); 
    return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Dummy other = (Dummy) obj; 
    if (value == null) { 
     if (other.value != null) 
     return false; 
    } else if (!value.equals(other.value)) 
     return false; 
    return true; 
    } 

같은 같은 당신이 구현을 절약 할 수 있도록 마우스 오른쪽 버튼으로 클릭하고 자동으로 그 방법을 생성 할 수있는 일식 할 수

+0

정말 대답하지 않습니다. 그는 퍼즐을 가지고 있으며, 퍼즐의 전체적인 포인트는 * hash * C * ode *가 아닌 * hashcode *라는 농담입니다! 그는 프로그램을 수정하기 위해 ** 한 ** 캐릭터에 대해 물었다. – GhostCat

+0

잡았는데 .... thnks –