Java] 📫 hashCode == 메모리 주소일까?
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Java 개발자, JVM 내부 동작 원리 이해 필요자
핵심 요약
hashCode()
는 메모리 주소가 아닌주소를 기반으로 계산한 수치
를 반환System.identityHashCode()
와hashCode()
는 동일한 값을 반환 (Object 클래스의 기본 구현 시)hashCode()
와메모리 주소
는 값이 다름 (2060468723
vs30331364672
)
섹션별 세부 요약
1. hashCode와 메모리 주소의 차이점
hashCode()
는 JVM이 내부적으로 계산한 해시 값이며, 메모리 주소와 직접적으로 같지 않다.System.identityHashCode()
는 객체의 고유 식별자로,hashCode()
와 동일한 값을 반환한다.toString()
메서드에서@
뒤의 값은hashCode()
의 16진수 변환 값과 동일하다.
2. JVM 내부 동작 원리
hashCode()
는native
메서드로, JVM의 네이티브 코드에서 구현된다.JVM_ENTRY(jint, JVM_IHashCode(...))
함수를 통해 해시 코드가 계산되며,FastHashCode
메커니즘을 사용한다.ObjectSynchronizer::FastHashCode
함수는 객체의 락 상태를 확인한 후 해시 값을 반환한다.
3. hashCode의 일반 규약
- 동일한 객체에 대해
hashCode()
는 동일한 값을 반환해야 한다. equals()
가true
인 두 객체는hashCode()
도 동일해야 한다.equals()
가false
인 두 객체는hashCode()
가 다를 필요는 없지만, 성능 최적화를 위해 다를 수 있다.
결론
hashCode()
는 메모리 주소와 다름을 인지하고, 해시 테이블(예:HashMap
)에서의 동작을 이해해야 한다.System.identityHashCode()
와hashCode()
가 동일한 값을 반환하는 이유는 Object 클래스의 기본 구현 방식에 기인한다.- JVM 버전에 따라
hashCode()
의 내부 구현 방식이 변경될 수 있으므로, 구체적인 동작은 문서와 JVM 소스 코드를 참조해야 한다.