반응형
System.identityHashCode()와 hashCode() 두 메서드 모두 객체의 고유한 값을 리턴한다.
- System.identityHashCode()
- 객체의 고유한 hashcode를 리턴하는 메소드이다.
- hashCode()
- 모든 객체의 부모 클래스인 Object 클래스에 정의되어있다.
void new연산자() {
Member member = new Member("hello", "1");
Member member2 = new Member("world", "2");
Member member3 = new Member("hello", "1");
System.out.println(System.identityHashCode(member)); //646204091
System.out.println(System.identityHashCode(member2)); //445010547
System.out.println(System.identityHashCode(member3)); //680306160
System.out.println(member.hashCode()); //-1220935265
System.out.println(member2.hashCode()); //-782084384
System.out.println(member3.hashCode()); //-1220935265
}
record Member(
String name,
String id
) {
}
System.identityHashCode()는 정의된 값이 같아도 객체의 고유한 hashcode를 출력하고 있다.
HashCode()는 Object 클래스에 정의된 것을 출력하기 때문에 같은 값이라면 같은 hashcode를 출력한다.
Constructor.java
/**
* Returns a hashcode for this {@code Constructor}. The hashcode is
* the same as the hashcode for the underlying constructor's
* declaring class name.
*/
public int hashCode() {
return getDeclaringClass().getName().hashCode();
}
String.java
/**
* Returns a hash code for this string. The hash code for a
* {@code String} object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using {@code int} arithmetic, where {@code s[i]} is the
* <i>i</i>th character of the string, {@code n} is the length of
* the string, and {@code ^} indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
public int hashCode() {
// The hash or hashIsZero fields are subject to a benign data race,
// making it crucial to ensure that any observable result of the
// calculation in this method stays correct under any possible read of
// these fields. Necessary restrictions to allow this to be correct
// without explicit memory fences or similar concurrency primitives is
// that we can ever only write to one of these two fields for a given
// String instance, and that the computation is idempotent and derived
// from immutable state
int h = hash;
if (h == 0 && !hashIsZero) {
h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
if (h == 0) {
hashIsZero = true;
} else {
hash = h;
}
}
return h;
}
Object의 hashCode() 메소드는 하위 클래스에서 override가 가능하기 때문에 객체마다 유일한 값을 갖고 있지 않는다.
객체의 특성이 동일하다는 것을 표현하기 위해 이 메소드를 오버라이드할 수 있다.
예를 들어, Member의 hashcode가 갖다면 객체는 달라도 문자열은 동일하다는 것을 의미한다.
System.identityHashCode()는 오버라이드가 안되고 객체의 고유한 hashCode를 리턴합니다.
객체 자체를 비교하려면 해당 메소드를 사용한다.
반응형
'Delvelopment > Java' 카테고리의 다른 글
[Java] Object 클래스 구성 (0) | 2022.01.23 |
---|---|
[Java] Method Dispatch (Static Dispatch, Dynamic Dispatch, Double Dispatch) (0) | 2022.01.23 |
JUnit이란? JUnit5 (Assertion, 어노테이션) (0) | 2022.01.14 |
[JAVA] 산술, 비트, 관계, 논리, 3항, 화살표 연산자, java14 switch 문 (0) | 2022.01.06 |
[JAVA] 데이터 타입, 리터럴이란 , 변수의 Scope(범위) LifeTime(수명) (1) | 2022.01.03 |
댓글