자바에서 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
'2019백업' 카테고리의 다른 글
JAVA-java.util.* (Date,Calendar,StringTokenizer,ArrayList,HashMap) (0) | 2019.03.29 |
---|---|
JAVA - StringBuffer, StringBuilder 차이점 (0) | 2019.03.29 |
2.자바 기본 (0) | 2019.03.19 |
1. JAVA 설치 & PATH 설정하기 (0) | 2019.03.15 |
5강 특수문자와 서식문자 (0) | 2019.03.11 |