Java의 String

00_8_3·2022년 9월 30일
0

다시보는 JAVA

목록 보기
1/2

String

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));

new String String pool에 저장하기.


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
  • 비교 연산자의 경우 메모리 주소를 비교
  • equals의 경우 값 자체를 비교

참고

https://www.geeksforgeeks.org/difference-between-and-equals-method-in-java/

0개의 댓글

관련 채용 정보