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/
'Java > 정리' 카테고리의 다른 글
[Java] (int, character) & (String) 값 비교 (0) | 2021.05.05 |
---|---|
[Java] 입력 버퍼 비우기(Next(), NextLine()) (0) | 2021.05.04 |
[Java] 메모리구조 & 참조변수 (0) | 2021.05.03 |
9회차_반복문(do ~ while문) (0) | 2021.04.19 |
7회차_제어문(switch문_return/break 차이) (0) | 2021.04.19 |