본문 바로가기
Java/정리

[Java] IdentityHashcode & Hashcode

by 콧등치기국수 2021. 5. 3.

2-1. IdentityHashcode

 

1)리터럴

stringpool(heap에 있는 영역 중 하나) 에 담긴다. 이미 값이 있으면 새로 주소를 생성하지 않는다.

 

2) new

heap에서 무조건 새로운 인스턴스 객체를 생성한다. (동일값 존재유무 상관없이)

반환 타입이 참조형이라는 것은 객체의 주소를 반환한다는 것을 의미한다.

 

3) example

public void stringTest() {

		String s = "안녕하세요"; //stringpool생성됨
		String s1 = "안녕하세요"; //이미 존재
		String s2 = new String("안녕하세요"); //heap생성
		
		System.out.println("*1--------------------------------");
		
		System.out.println(System.identityHashCode(s));
		System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));
		
		System.out.println("*3--------------------------------");
		
		String t = "정지훈"; //stringpool 생성
		String t1 = "이효리"; //stringpool 생성
		String t2 = new String("유재석"); //heap 생성
		String t3 = "유재석"; //stringpool 생성
		String t4 = "이효리"; //이미 존재
		
		System.out.println("t: " + System.identityHashCode(t));
		System.out.println("t1: " +System.identityHashCode(t1));
		System.out.println("t2: " +System.identityHashCode(t2));
		System.out.println("t3: " +System.identityHashCode(t3));
		System.out.println("t4: " +System.identityHashCode(t4));
		
		System.out.println("*4--------------------------------");		
		
		System.out.println("t2 : " + t2);
		System.out.println(System.identityHashCode(t2));
		t2 = "놀면뭐하니";
		System.out.println(System.identityHashCode(t2));   //값이 달라서 주소값 새로 생성
		System.out.println("t4 : " + t4);
		t2 = new String("유재석"); //있어도 새로 생김
		System.out.println(System.identityHashCode(t2));
		System.out.println("t2 : " + t2);
		
		/*
		 * System.identityHashCode : Hashcode와 같이 주소값을 의미, os(system)에서 가지고 있는 주소값
		 * hashcode :  객체가 메모리에 가진 해쉬 주소값을 의미, 10진수(string에서는 재정의 되어있다.)
		 * */

 

*1--------------------------------
942731712
942731712
971848845

 

1 -- System.identityHashCode(s): stack에 저장된 주소값 불러옴

2 -- System.identityHashCode(s1) : 같은 값이므로 새로 생성하지 않는다.

3 -- String s2 = new String("안녕하세요");

"new" : 새로운 객체 만듦

 

 

*3--------------------------------
t: 1910163204
t1: 305623748
t2: 758529971                             //new -> heap영역에 생성
t3: 2104457164                          //리터럴-> stringpool영역에 생성
t4: 305623748
*4--------------------------------
t2 : 유재석
758529971                               // t2 (유재석)
1940030785                             // t2 (놀면 뭐하니)
t4 : 이효리
1869997857
t2 : 유재석

 

 

2-2. Hashcode

System.out.println("*2--------------------------------");
		
		System.out.println(s.hashCode());
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode()); //hashcode는 다 같은 곳에 저장한다.
		

 

*2--------------------------------
803356551
803356551
803356551

 

String클래스는 Hashcode를 오버라이딩 하기 때문에 서로 다른 객체여도 모든 값이 같게 나온다.

String의 hashcode가 같다면 객체는 달라도 문자열은 동일하다는 것을 의미한다.

 

[참고] codechacha.com/ko/java-system-identityhashcode/