String vs StringBuilder vs StringBuffer
String
문자열을 더할 때마다 새로운 주소값을 가진 객체를 만든다. 그리고 사용된 객체는 gc의 관리 대상이 된다. → GC를 하면 할수록 CPU를 사용하게 되고 시간도 많이 소요됨. 메모리 소요를 최소화 해야함.
짧은 문자열을 더할 때 사용
StringBuilder
StringBuilder 소스코드 일부
동기화를 하지 않음(그러기에 리소스가 적게 들어 StringBuffer에 비해 빠름)
스레드 safe 여부에 관계 없는 개발 ex) 메서드 내 변수
StringBuffer
StringBuffer 소스코드 일부
기본적으로 synchronized 가 붙어있음. → 동기화
스레드 안전한 프로그램 사용시
static 문자열 변경, singleton 클래스에 선언된 문자열일 경우
성능비교 소스 코드
package org.main.java_performance_tuning_story; import java.util.logging.Logger; public class String_Builder_Buffer { public static void main(String[] args) { final String aValue = "abcde"; Logger logger = Logger.getLogger("Logger"); for (int i = 0; i < 10; i++) { String a = new String(); StringBuffer b = new StringBuffer(); StringBuilder c = new StringBuilder(); long startTime = System.currentTimeMillis(); for(int j=0; j<100000; j++) { a += aValue; } long endTime = System.currentTimeMillis(); logger.info("String spent time1 : " + (endTime - startTime)); long startTime2 = System.currentTimeMillis(); for (int j = 0; j < 100000; j++) { b.append(aValue); } long endTime2 = System.currentTimeMillis(); logger.info("String spent time2 : " + (endTime2 - startTime2)); long startTime3 = System.currentTimeMillis(); for (int j = 0; j < 100000; j++) { c.append(aValue); } long endTime3 = System.currentTimeMillis(); logger.info("String spent time3 : " + (endTime3 - startTime3)); logger.info("================================================="); } } }
Last updated