2019백업

자바-String클래스

728x90

JavaString의 메모리에 대한 고찰

 

Java String 의 메모리에 대한 고찰 - Leopold Baik (백중원) - Medium

Java 언어에서 String은 무심코 사용되는 클래스 중에 하나가 아닐까 생각이 든다. String은 두 가지 생성 방식이 있고 각각의 차이점이 존재한다.

medium.com

자바에서 String은 두 가지의 생성 방법

  1. new 연산자를 사용한 방식

  2. 리터럴을 사용한 방식

차이점 : new을 통해 생성하게 되면 heap 영역에 리터럴을 사용하면 constant pool에 저장되게 된다.

 

String str = "JAVA";

String str2 = "JAVA" 

String str3 = new String("JAVA");

 

  1) if (str == str2)

  2) if (str == str3)

  3) if (str.equals(str3))

 

str, str2, str3는 같은 해쉬코드를 참조한다.

1), 3)의 경우 참을 반환하지만 2)의 경우 false를 반환한다.

 

2)가 false를 반환하는 이유는 ==( 등가비교연산자)의 경우 주소(4byte)를 비교하게 되고 JVM가 설정한 해쉬코드는 같으나 주소영역은 다르기 때문에 false를 반환하게된다.  

 

String을 new로 생성하지 않고 "" 리터럴을 사용하여 생성할 경우, 내부적으로 new String() 메소드 호출 이후에 String.intern()이라는 메소드가 호출되어 고유의 인스턴스를 공유하도록 interned됩니다.  이것은 생성한 String을 Constant pool에 등록하는(만약 이전에 같은 char sequence의 문자열이 이미 상수풀에 있다면 문자열을 힙에서 해제하고 그 상수풀의 레퍼런스(해쉬코드)를 반환) 작업을 수행합니다.

 

String API in Java | #4 | intern() Method of the java.lang.String Class in Java

 

 

참조:

1) 리터럴과 상수 https://mommoo.tistory.com/14 

2) JavaString의 메모리에 대한 고찰 https://medium.com/@joongwon/string-%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-57af94cbb6bc  

3) String.intern()의 쓰임새 : http://www.mimul.com/pebble/default/2008/01/02/1199269440000.html

반응형