public class Main {
public static void main(String[] args) {
Map<PhoneNumber, String> m = new HashMap<>();
m.put(new PhoneNumber("010", 1234, 5678), "박상준");
System.out.println(m.get(new PhoneNumber("010", 1234, 5678))); // null 이 출력됨.
}
static class PhoneNumber {
private String key;
private int num;
private int num2;
public PhoneNumber(String key, int num, int num2) {
this.key = key;
this.num = num;
this.num2 = num2;
}
}
}
PhoneNumber
클래스는 hashcode
를 재정의하지 않았기에 논리적 동치인 2 객체가 서로 다른 해시코드 반환하여 규약을 지키지 못함규약
- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을
반환해야 한다
@Override
public int hashCode() {
return 42;
}
result = 31 * result + c;
int
변수 result 를 선언하고 첫 번째 핵심 필드로 초기화한다.hashcode
를 계산하고 갱신 static class PhoneNumber {
private String key;
private int num;
private int num2;
public PhoneNumber(String key, int num, int num2) {
this.key = key;
this.num = num;
this.num2 = num2;
}
@Override
public final boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PhoneNumber that)) return false;
return num == that.num && num2 == that.num2 && Objects.equals(key, that.key);
}
@Override
public int hashCode() {
int result = Objects.hashCode(key);
result = 31 * result + num;
result = 31 * result + num2;
return result;
}
}
private int cachedHashCode;
---
@Override
public int hashCode() {
int result = cachedHashCode;
if(result == 0) {
result = Objects.hashCode(key);
result = 31 * result + num;
result = 31 * result + num2;
cachedHashCode = result;
}
return result;
}