본문 바로가기

공부 정리/Java

StringBuffer vs StringBuilder

반응형

개요


자바는 연속되는 문자열을 표현하기 위한 3가지 클래스가 있은데, String, StringBuffer, StringBuilder입니다. 3가지의 차이점을 비교해보겠습니다.

 

 

String과의 차이점

  • String은 immutable 클래스
  • StringBuffer와 StringBuilder는 mutable 클래스

 

StringBuffer vs StringBuilder

No StringBuffer StringBuilder
1) 동기화되어 쓰레드 안전
(여러개의 쓰레드가 StringBuffer 메서드를 동시에 접근할 수 없다)
동기화되지 않아 쓰레드에 안전하지 않음(여러개의 쓰레드가 StringBuilder 메서드를 동시에 접근할 수 있다)
2) Java 1.0에서 등장 Java 1.5에서 등장
3) 동기화 때문에 상대적으로 성능 비용 발생 동기화가 안되어 성능이 StringBuffer에 비해 우수

 

StingBuffer는 substring, length, capacity, trimToSize 등의 메서드가 있지만, 이 메서드들은 String에도 있기 때문에 많이 사용되지 않습니다. 쓰레드 안전한 동기화의 특징이 있는데 이는 오히려 성능을 저하시켜 StringBuilder가 등장했습니다. 만약 싱글 쓰레드 환경이거나 쓰레드 안정성이 필요하지 않는 경우에 StringBuilder를 사용하면 됩니다.

 

 

성능 테스트하기


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