
스트링 객체의 캐싱 기능
문자열은 가장 많이 쓰이는 데이터 타입 중 하나. 따라서 기본적으로 가장 많은 메모리를 차지하게 됨. 많이 쓰이는 데이터일 수록 문자열 객체는 재사용 될 가능성이 높기에 자바는 같은 값일 경우 어플리케이션 당 하나의 String 객체 만을 생성해두어 JVM의 힙(heap)을 절약하고자 함.
for(int i = 0; i < 500; i++) {
String str = "Hello World";
System.out.println(str);
}
만약 스트링이 불변성의 속성을 가지고 있지 않았다면, 위 코드를 실행할 때 힙에 “Hello World” 객체가 500개나 생성될 것이다. 하지만 불변성이라는 속성 때문에 힙 안에는 “Hello World”라는 객체 하나만 생성되게 되고,
스택 안에는 해당 객체를 참조하는 참조값만 500개 생성 되었다가 처리가 끝나면 사라지게 된다. (빠른 처리와 메모리 효율 두 장점을 모두 챙길 수 있다!)
보안기능
스레드 안정성
String str = "문자열";
str = "문자열2";
Memory allotment of String
스트링은 어떻게 선언하느냐에 따라 메모리에 할당하는 방식이 다르다. (=힙 자체에 저장하거나 힙 안에 있는 특정 메모리 영역에 저장하거나.)
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa");

String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa");
System.out.println(a == b); //true
System.out.println(a == c); //false
System.out.println(c == d); //false
System.out.println(a.equals(b)); //true
System.out.println(a.equals(c)); //true 주소값이 아니라 값 자체를 비교하는 거라면 .equals()메소드 사용
System.out.println(c.equals(d)); //true리터럴 방식
리터럴 방식으로 선언하게 되면, 문자열 객체는 ‘String Constant Pool’에 저장된다.
String str = "Geeks";
String Constant Pool이란?
new 연산자(operator) 방식
스트링은 new 연산자를 활용하여 동적으로 메모리(힙)에 할당할 수 있다.
이 경우에는 동적으로 메모리에 할당되기 때문에 힙의 새로운 영역에 저장된다. 즉, String Constant Pool에는 저장되지 않는다.
String str = new String("Geeks");
만약 new 연산자로 선언된 스트링을 String Constant Pool에 저장하고 싶다면?
intern() 메소드를 사용하면 String pool에서 같은 값을 갖는 메모리를 저장할 수 있다.
String s1 = new String("Cat");
String s2 = s1.intern(); // this will add the string to string constant pool.
String s3 = "Cat";
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true
System.out.println(s1.intern() == s3); // true
Intern이란?
리터럴 선언과 new 연산자 선언 중 어떤 방법이 더 선호되나? (참고링크)