학원 수강시 책 내용으로 분명한 차이가 있다고 한 내용이었다.
기억하기로는
'=='는 객체의 주소 값을 비교해서 같은 객체면 true를 반환 하는 것이었다.
Equals는 해당 주소안의 값을 비교해서 값이 같다면 true를 반환 한다고 기억하고 있었다.
==> 오늘 강의를 보면서 들은 내용은 '=='얘는 new String("값");으로 새로운 객체를 생성하여 집어넣은 것 이므로 다른 객체 값을 비교하게 된다고 이해했다.
그렇다면 매번 String s3 ="HI"; 해서 만든 객체와
String s4 = new String("HI");
얘네 둘은 다른 객체이면서, 같은 값을 가져야 하는데
코드를 작성해 보았다.
위에 내용처럼 코드를 작성해 보았다 .
이해한 내용이 맞다면,
콘솔에서 이렇게 확인이 가능할 것이다.
사진과 같이 콘솔에서 생각한 값이 출력되었다.
그러고 String 객체 생성방법에 대해서 찾아보았다!
첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고,
두번째는 new 연산자를 사용하는 것이다.
두 방법에 차이는 무엇일까?
위의 사진을 보면
String literal로 생성한 객체는 "String pool"에 들어간다.
String literal로 생성한 객체의 값이 이미 String pool에 존재한다면, 해당 객체는 String Pool의 reference를 참조한다.
new 연산자로 생성한 String 객체는 같은 값이 String Pool에 이미 존재하더라도 , Heap 영역 내 별도의 객체를 가리키게 된다.
-> 즉 객체 참조 값인 해시코드 값이 다르고 다른 객체를 가리키므로 FALSE
String Constant Pool 이란?
자바 메모리 중 Heap 영역 안에 위치하여 스트링을 별도로 관리하는 장소입니다.
Heap 안에 있기 때문에 모든 스레드가 공유할 수 있고 가비지 콜렉터의 대상이 됩니다.
https://coding-factory.tistory.com/536
감사합니다.