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 영역에 할당

string 출처 : 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