String
String s = “”; 특징
- 리터럴 방식
- 새로운 값을 할당할 때마다 새로운 주소값 생성
- 두 문자를 합쳐도 새로운 주소값으로 할당
- String constant pool(상수 영역) 할당
String s1 = "TEST 1";
String s2 = "TEST 2";
System.out.println("s1: " + s1.hashCode());
System.out.println("s2: " + s2.hashCode());
s1 = s1 + s2;
System.out.println("s1: " + s1.hashCode());
StringBuffer sb = new StringBuffer();
System.out.println("sb: " + sb.hashCode());
sb.append("TEST StringBuffer");
System.out.println("sb: " + sb.hashCode());
s1: -1823841245
s2: -1823841244
s1: 833872391
sb: 1956725890
sb: 1956725890
String s = new String() 특징
- new 연산자를 이용한 방식
- heap 영역에 할당
출처 : http://www.journaldev.com/797/what-is-java-string-pool
String 관련 혼동문제
public class StringTest {
public static void main(String[] args) {
String msg1 = "Hello";
String msg2 = "Hello";
String msg3 = new String("Hello");
String msg4 = new String("Hello");
String msg5 = new String("Hello").intern();
System.out.println(msg1 == msg2);
System.out.println(msg3 == msg4);
System.out.println(msg1 == msg3);
System.out.println(msg1 == msg5);
}
출처: https://tomining.tistory.com/195 [마이너의 일상]
true
false
false
true
String에서 hashCode(), identityHashCode 비교
public class Test {
public static void main(String[] args) {
String s1 = "Test";
String s2 = "Test";
String s3 = new String("Test");
String s4 = new String("Test");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println();
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
System.out.println(System.identityHashCode(s4));
}
}
2603186
2603186
2603186
2603186
2018699554
2018699554
1311053135
118352462
구조
References
- https://novemberde.github.io/2017/04/15/String_0.html