-
[JAVA] String StringBuffer StringBuilderJAVA 2019. 8. 26. 22:11
요약 : 성능에 신경을써야한다면, 많은 문자열을 연결할땐 StringBuilder를 사용하자 (단일스레드에서만 ^^)
String
StringBuilder
StringBuffer
객체상태
불변객체
가변객체
가변객체
멀티 스레드에서
동기화 지원여부
X
O
속도 (빠른순)
3등
1등
2등
- String은 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다.
- String은 불변객체라서 두문자열을 연결할 경우 양쪽의 내용을 모두 복사해야해서 성능저하가 많이 일어난다.
- StringBuilder, StringBuffer는 기존의 버퍼크기를 늘리며 유연하게 동작함.
String은 왜 불변인가?
- 클래스안에 들어가보면 알겠지만, 아래와 같이 final로 선언되어 있기 때문이다.
private final char value[];
예제코드
10만건 테스트
public class Main {
public static void main(String[] args) {
stringTest();
stringBuilderTest();
stringBufferest();
}
public static void stringTest(){
System.out.println("시작 : stringTest");
long start = System.currentTimeMillis();
String str="";
for(long i=0; i<=100000;i++){
str += "@@@";
}
long end = System.currentTimeMillis();
System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");
}
public static void stringBuilderTest(){
System.out.println("시작 : stringBuilderTest");
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(long i=0; i<=100000 ;i++){
sb.append("@@@");
}
long end = System.currentTimeMillis();
System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");
}
public static void stringBufferest(){
System.out.println("시작: stringBufferest");
long start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for(long i=0; i<=100000 ;i++){
sb.append("@@@");
}
long end = System.currentTimeMillis();
System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");
}
}결과
위에서는 반복회수가 그렇게 크지않아 StringBuffer와 StringBuilder가 비슷비슷하게 나옴
StringBulider와 StringBuffer만 다시 비교
public static void stringBuilderTest(){
System.out.println("시작 : stringBuilderTest");
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(long i=0; i<=1000000 ;i++){
sb.append("@@@");
}
long end = System.currentTimeMillis();
System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");
}
public static void stringBufferest(){
System.out.println("시작: stringBufferest");
long start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for(long i=0; i<=1000000 ;i++){
sb.append("@@@");
}
long end = System.currentTimeMillis();
System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");
}결과
StringBuilder가 빠름.
'JAVA' 카테고리의 다른 글
AssertJ 사용하기 (0) 2020.09.15 [JAVA] 배열 오름차순, 내림차순 (0) 2019.10.13 [JAVA] IntelliJ에서 Stream 디버깅하기 (0) 2019.03.30 [JAVA] JSON 다루기 정리 (JACKSON - ObjectMapper) (0) 2018.11.25 [JAVA] 함수형 인터페이스 Predicate (0) 2018.11.12