개요
자바는 연속되는 문자열을 표현하기 위한 3가지 클래스가 있은데, String, StringBuffer, StringBuilder입니다. 3가지의 차이점을 비교해보겠습니다.
String과의 차이점
- String은 immutable 클래스
- StringBuffer와 StringBuilder는 mutable 클래스
StringBuffer vs StringBuilder
No | StringBuffer | StringBuilder |
1) | 동기화되어 thread-safe (여러개의 쓰레드가 StringBuffer 메서드를 동시에 접근할 수 없다) |
동기화되지 않아 쓰레드에 안전하지 않음(여러개의 쓰레드가 StringBuilder 메서드를 동시에 접근할 수 있다) |
2) | Java 1.0에서 등장 | Java 1.5에서 등장 |
3) | 동기화 때문에 상대적으로 성능 비용 발생 | 동기화가 안되어 성능이 StringBuffer에 비해 우수 |
StingBuffer는 substring, length, capacity, trimToSize 등의 메서드가 있지만, 이 메서드들은 String에도 있기 때문에 많이 사용되지 않습니다. thread-safe 하지만 이는 오히려 성능을 저하시킬 수 있습니다.
그래서 StringBuilder가 등장했습니다. 동기화되지 않아 쓰레드에 안전하지 않지만 성능이 우수합니다. 만약 싱글 쓰레드 환경이거나 쓰레드 안정성이 필요하지 않는 경우에 StringBuilder를 사용하면 됩니다.
코드 비교하기
문자열을 추가하는 append()의 코드를 비교해보겠습니다. StringBuffer의 경우 synchronized 키워드가 있기 때문에 thread-safe를 보장합니다.
//StringBuffer.java
@Override
public synchronized StringBuffer append(CharSequence s) {
toStringCache = null;
super.append(s);
return this;
}
//StringBuilder.java
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
성능 테스트하기
1개의 쓰레드 환경에서 StringBuffer와 StringBuilder의 시간 측정 및 메모리 사용을 확인해보겠습니다.
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
i 값 | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
메모리 사용은 같지만, 심지어 싱글 쓰레드에서도 StringBuilder가 더 적은 시간이 걸립니다.
예상 질문
- String과 StringBuffer, StringBuilder의 차이점은?
- StringBuffer와 StringBuilder의 차이점은?
참고
https://www.javatpoint.com/difference-between-stringbuffer-and-stringbuilder
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder
'학습 > Java' 카테고리의 다른 글
스프링 AOP (1) - 동적 프록시 (0) | 2023.01.11 |
---|---|
mutable vs immutable (0) | 2022.11.01 |
Java 8에 등장한 Optional이란? (0) | 2022.10.29 |
자바 8에 추가된 Date Time API (0) | 2022.10.28 |
Java 8에서 개선된 가비지 컬렉터는? (0) | 2022.10.19 |