샘플 코드를 고려 돌려줍니다 :해싱은 진정한
class EmployeeClass {
int id;
public EmployeeClass(int eid) {
this.id=eid;
}
@Override
public int hashCode(){
return this.id;
}
@Override
public boolean equals(Object o){
return true;
}
}
public class HashcodeAndEquals {
public static void main(String[] args) {
Map map=new HashMap();
EmployeeClass e1=new EmployeeClass(1);
map.put(e1, "Employee 1"); // line 1
EmployeeClass e2=new EmployeeClass(2);
map.put(e2, "Employee 2");
EmployeeClass e3=new EmployeeClass(3);
EmployeeClass e4=new EmployeeClass(1); // line 2
EmployeeClass e5=new EmployeeClass(1);
map.put(e5, "Employee 5"); // line 3
System.out.println("e1 -> "+map.get(e1));
System.out.println("e2 -> "+map.get(e2));
System.out.println("e3 -> "+map.get(e3));
System.out.println("e4 -> "+map.get(e4)); // line 4
System.out.println("e5 -> "+map.get(e5));
}
}
출력 : 사실
e1 -> Employee 5
e2 -> Employee 2
e3 -> null
e4 -> Employee 5
e5 -> Employee 5
라인 (1) 실행 후, 다음 3 호선 대체 e1
의 값하지만 내 동등한 방법 반환 만. 심지어 라인 4에서 equals
메소드가 true를 리턴하더라도 e4
의 값을 얻습니다. equals
메서드는 비교가 없기 때문에 true를 반환하고 put 및 get은 여기서 어떻게 작동하는지 알 수 있습니다. 무엇이 뒤에서 일어나고 있습니까?
디버거를 사용하여 알아낼 수 있습니까? – skaffman
당신은 무엇에 놀랐습니까? e1, e4 및 e5 키는 동일한 값이므로 동일한 값을 가리 킵니다. – nrainer
이 이해되었습니다. 묻기 전에 사용 했어야합니다. 어쨌든 gr8 도움. – Nizam