String
String str = "hello";
str = str + " world";
- 새로운 값을 할당할 때마다 새로 클래스에 대한 객체가 생성된다.
- String에서 저장되는 문자열은
private final char[]
의 형태이기 때문에 바꿀 수 없다.
String + String + String + …
String str = "hello";
str = str + " world";
- 각각의 String 주소값이 Stack에 쌓이고, GC가 호출되기 전까지 Heap에 쌓인다.
- String을 더할때는 StringBuffer나 StringBuilder를 사용하는 것이 좋다.
StringBuffer
public final class StringBuffer
extends AbstractStringBuilder
implements Serializable, Comparable<StringBuffer>, CharSequence { ... }
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");
soutp(sb);
soutp(sb.toString());
- Memory에 append하는 방식으로, 클래스에 대한 객체를 직접 생성하지 않는다.
- 동기적으로 처리한다. (Thread-Safe)
StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuilder>, CharSequence { ... }
StringBuilder sb = new StringBuilder("hello");
sb.append(" world");
soutp(sb);
soutp(sb.toString());
- Memory에 append하는 방식으로, 클래스에 대한 객체를 직접 생성하지 않는다.
- 비동기적으로 처리한다.
JDK 1.5 이후
- 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었다.
- 단, 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없다.
출저