String 초기화 : 메모리 0번지 가리키기 -> null (String str = null;)
String str = null;
str = "choi"; // "choi"은 값(숫자, 문자'', true/false...)이 아니므로(식이므로) 식을 해석하면 참조값으로 해석된다.
str에 값을 넣으면 원래는 참조값(암호화된 참조값,hash값)이 출력되어야 하지만 우리의 편의를 위해 String타입은 참조가 가리키는 문자열값이 출력되도록 장치가 되어있다.(오버라이딩)
System.out.println(str); //"choi"
// String타입 str이 가리키는 암호화된 해시값 출력해보기.
System.out.println("str hashCode"+str.hashCode()); // 3052799
리터럴을 바로 입력한 데이터는 문자열이 같을 때 하나의 객체를 공유한다.
"abc" 두 개의 문자열 변수를 지정했지만 Heap메모리의 String Pool에는 "abc" 하나의 문자열만 존재한다.
즉, s1 s2는 같은 "abc" 문자열을 가리킨다.
String s1 = "abc";
String s2 = "abc";
System.out.println(s1); // abc
System.out.println(s2); // abc
System.out.println("s1 hashCode: " + s1.hashCode()); // 96354
System.out.println("s1 hashCode: " + s2.hashCode()); // 96354
System.out.println("s1 identityHashCode: " + System.identityHashCode(s1)); // 916249144
System.out.println("s2 identityHashCode: " + System.identityHashCode(s2)); // 916249144
new로 생성하면 Heap메모리에 동일한 문자열이 있어도 무조건 새롭게 객체를 생성한다.
즉, str1 str2 는 각각의 "abc"문자열을 가리킨다.
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println("str1 hashCode: " + str1.hashCode()); // 96354
System.out.println("str2 hashCode: " + str2.hashCode()); // 96354
System.out.println("str1 identityHashCode: " + System.identityHashCode(str1)); // 1188725070
System.out.println("str2 identityHashCode: " + System.identityHashCode(str2)); // 1390831647