ABOUT ME

-

오늘 방문자
-
어제 방문자
-
전체
-
  • [JAVA] String StringBuffer StringBuilder
    JAVA 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가 빠름.




    댓글

Designed by Tistory.