Immutable한 String의 단점
String은 불변하는 객체입니다.
String을 더하면 새로운 객체가 생성되고 기존 객체는 GC에 의해 버려집니다.
만약 String을 계속 더한다면, 쓰레기를 계속 채우는 상황이 발생하는 것입니다.
이 경우 메모리 관리가 비효율적이여서 성능에 안좋습니다.
StringBuffer, StringBuilder
String의 단점을 보안하기 위해 나온 클래스들입니다.
StringBuffer, StringBuilder는
append로 전달받은 변수를 메모리에 할당하는 것이 아니라
append가 발생할 때 마다 버퍼의 끝에 문자열을 추가합니다.
마지막으로 toString() 메소드를 통해 버퍼에 저장되어 있는 최종값을 String으로 메모리에 할당합니다.
두 클래스에서 제공하는 메소드는 동일합니다.
하지만 Tread Safe 면에서는 차이가 있습니다.
StringBuffer : Tread Safe함
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
StringBuilder : Tread Safe하지 않음
@Override
@IntrinsicCandidate
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer는 내부적으로 Synchronized를 사용하여멀티스레드 환경에서 안전합니다.
속도는 당연히 Synchronized를 사용하지 않아 Tread Safe하지 않는 StringBuilder가 빠릅니다!
언제 사용해?
StringBuffer :여러 Tread에서 문자열에 동시 접근하는 경우
StringBuilder : 하나의 스레드에서 접근하는 경우
마무리
String을 변경해야하는 상황이라면 StringBuffer, StringBuilder로 메모리를 효율적으로 사용하는 습관이 필요합니다!
참고
https://alkhwa-113.tistory.com/entry/String%EA%B3%BC-StringBuilder
'Java' 카테고리의 다른 글
HashMap, HashTable, ConcurrentHashMap (0) | 2023.08.22 |
---|---|
Java - 타입추론 Var (0) | 2023.08.17 |
Optional 클래스 (0) | 2023.08.17 |
인터페이스와 추상클래스, Enum (0) | 2023.07.31 |
Pass by Value, Pass by reference (0) | 2023.07.27 |