1. Object.hashCode()
- 정의: 모든 객체가 가지고 있는 기본 메서드 (Object 클래스에서 상속).
- 역할: 객체 식별용 해시코드 반환.
- 기반: 보통 메모리 주소 기반이지만, JVM 내부적으로 난수화(Randomized)된 주소 기반 값을 사용합니다. (즉, 객체의 상태와 무관하게 객체 자체에 대한 식별 값)
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.hashCode()); // ex) 12345678
System.out.println(obj2.hashCode()); // ex) 87654321 (다른 값)
서로 다른 객체 → 다른 hashCode()
같은 객체 반복 호출 → 같은 값 반환
2. Objects.hash(Object... values)
- 정의: Objects 유틸리티 클래스의 정적 메서드.
- 역할: 여러 값(필드 등)을 받아 그 조합으로 논리적인 해시코드 생성.
- 기반: 인자로 전달된 값들의 hashCode() 값을 조합해서 생성 (메모리 주소와 무관).
String name = "Alice";
int age = 30;
int hash = Objects.hash(name, age); // name과 age의 값 기반 해시
System.out.println(hash); // 항상 같은 값 (내용이 같다면)
내부 구조 (간략화된 예시):
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
public static int hashCode(Object[] a) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
Arrays.hashCode() 는 메모리 주소 기반이 아니다.
예제
public class Person {
String name;
int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age); // 값 기반
}
}
Set<Person> set = new HashSet<>();
set.add(new Person("Alice", 30));
set.add(new Person("Alice", 30)); // 중복으로 인식, 하나만 저장
System.out.println(set.size()); // 1 (정상)
hashCode() 를 Override해서 재정의 하지 않으면 메모리 주소기반의 해시 진행.