자바의 Primitive Type과 Reference Type
문자열은 Reference Type에 속하지만 다른 객체들과 차이점 존재
String name1 = "java"; // 리터럴로 생성
String name2 = new String("java"); // new 연산자로 생성
public static void main(String[] args) {
String s1 = "Hello World";
String s2 = "Hello World";
String s3 = new String("Hello World");
System.out.println(s1 == s2); // true
System.out.println(s2 == s3); // false
}
String name = "java";
name += "Programing";
문자열 리터럴은 불변이기 때문에 thread-safe
String으로 연산을 할 경우, 기존 문자열은 불변이기 때문에 새로운 객체를 만들고 참조하게 되고, 기존 문자열은 참조가 사라지게 되어 GC의 대상이 된다
→ GC의 대상이 되는 객체가 많아지면 메모리가 낭비되고 GC의 응답 속도에 영향을 미침
→ GC의 대상이 되는 객체를 최소화 시켜야 함

StringBuffer와 StringBuilder는 내부적으로 동적배열 사용
내부 버퍼에 문자열을 저장해두고, 안에서 추가, 삭제등의 작업을 할 수 있음
자바에서 String연산을 위해 제공하는 객체
String으로 + 연산을 수행하면 내부적으로 StringBuilder를 수행하지만, + 연산만큼 자동으로 변환된 StringBuilder가 GC의 대상이 되기 때문에 메모리에 영향을 미치는것은 동일함
synchronized 동기화 여부
// StringBuffer
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
// StringBuilder
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer
StringBuilder