Java의 String은 다른 타입들과는 다르게 참조형 타입이며
일반 참조형 타입과는 다르게 Heap에만 저장되지 않습니다.
String str = "cat";
str = str + str;
위 코드의 런타임 경우 첫 번째 줄의 str
이 저장된 heap이 수정되는 것이 아닌
"catcat"
을 새로운 heap에 저장하여 가르키게 됩니다.
다름을 알기 전에
new String
과 String 리터럴의 차이를 알아봐야 합니다.
String str1 = "test";
String str2 = "test";
// str1 === str2 // true
위 코드의 경우 test
라는 값을 Heap 안의 String pool
이라는 공간에 저장하게 되어
str2에도 str1을 가르키는 주소와 같은 주소를 알려주게 됩니다.
반면
String str3 = new String("test");
String str4 = new String("test");
// str1 === str2 // false
위의 경우 일반적인 참조형 타입과 마찬가지로 Heap에
각각의 인스턴스를 저장하게 됩니다.
즉, 다른 주소를 저장합니다.
변수의 hashCode를 확인해보면 (같은 메모리 위치를 참조하는가)
알 수 있습니다.
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
System.out.println(System.identityHashCode(str3));
System.out.println(System.identityHashCode(str4));
System.out.println(System.identityHashCode(str5));
String str5 = new String("test").intern();
// str1 === str5 // true;
==
와 equals의 차이비교 연산자 ==
와 equals의 차이
String s1 = "HELLO";
String s2 = "HELLO";
String s3 = new String("HELLO");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
https://www.geeksforgeeks.org/difference-between-and-equals-method-in-java/