티스토리 뷰

Programming/Java

[Java] hashCode vs identityHashCode 차이점

감성적인 개발자 2021. 8. 5. 14:58

hashCode()

String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String("JAVA");

System.out.println("str 1 hashCode : " + str1.hashCode());
System.out.println("str 2 hashCode : " + str2.hashCode());
System.out.println("str 3 hashCode : " + str3.hashCode());
str 1 hashCode : 2269730
str 2 hashCode : 2269730
str 3 hashCode : 2269730

 

[value를 통해 hashCode를 만드는 매서드]

기본적으로 hashCode()는 Object 클래스에 정의되어 있기 때문에, 하위 클래스들이 오버라이딩 할 수 있습니다. 또한 String 클래스에선 value로 hashCode를 만들고 있기 때문에 object가 달라도 문자열이 같으면 동일한 hashCode를 리턴하게 됩니다.

 

 

identityHashCode()

String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String("JAVA");

System.out.println("str 1 hashCode : " + System.identityHashCode(str1));
System.out.println("str 2 hashCode : " + System.identityHashCode(str2));
System.out.println("str 3 hashCode : " + System.identityHashCode(str3));
str 1 hashCode : 1995265320
str 2 hashCode : 1995265320
str 3 hashCode : 1746572565

 

 

반면 identityHashCode()는 System클래스에 정의되며 오버라이딩 할 수 없고, 전달된 객체의 hashcode를 int 로 리턴합니다. 그러므로 값이 아닌 객체를 비교할 때는 identityHashCode()를 사용하는 것이 적절합니다. 라는 것이 잘 알려진 내용이나! str1과 str2의 고유값이 동일하게 출력되는게 보입니다. 즉 identityHashCode()를 이용하더라도 값이 같으면 동일한 고유값이 리턴될 수도 있다는 겁니다. 그러니 객체의 동일성을 확실히 비교하고 싶을 땐, getName을 사용하면 될 것이라 생각합니다. (참고)

 

정리

- hashCode()는 오버라이딩이 가능하지만 identityHashCode()는 재정의가 불가능하다. 

- String 클래스의 hashcode는 value가 동일할 때 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함