일반 StringBuffer vs String

황제낙엽 2008.06.10 11:07 조회 수 : 314 추천:152

sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  
http://blog.naver.com/manduys?Redirect=Log&logNo=130004423630

String StringBuffer 성능 차이

: 최종명


String은 내용을 변경할 수 없기 때문에 String에서 + 연산자를 사용하면 내부적으로StringBuffer를 생성해서 append() 메소드를 이용해서 문자열을 결합한다는 것은 대부분의 자바 프로그래머가 알고 있을 것입니다.

따라서 String을 많이 사용하는 서블릿이나 기타 프로그램에서는 되도록이면 StringBuffer char[]를 사용하시는 것이 효과적이라는 것도 다 알고 있는 사실입니다. 그런데 프로그램하다보면 귀찮아서라도 String을 많이 사용하는 것이 현실입니다.

그래서 잠시 10여분을 할애하여 String StringBuffer의 성능 차이를 테스트 해보았습니다. 테스트는 제가 새로 얻은(?) 펜티엄에 윈도우 2000이 설치된 컴퓨터 에서 했습니다. 테스트할 프로그램은 다음과 같습니다. 각 프로그램은 모두 "a" 문자열을 30,000번 씩 결합하도록 했습니다.

 

예제 :  StringTime.java

     1  public class StringTime {

     2

     3      public static void main(String args[]) {

     4          Runtime rt = Runtime.getRuntime();

     5          System.out.print(rt.freeMemory());

     6          System.out.println("/" + rt.totalMemory());

     7          long start = System.currentTimeMillis();

     8          String a = "a";

     9          for(int i=0; i < 30000; i++) {

    10              a += "a";

    11          }

    12          long stop = System.currentTimeMillis();

    13          System.out.println(stop - start);

    14          System.out.print(rt.freeMemory());

    15          System.out.println("/" + rt.totalMemory());

    16      }

    17

    18  }

 

 

 

예제 :  StringBuffer.java

     1  public class StringBufferTime {

     2

     3      public static void main(String args[]) {

     4          Runtime rt = Runtime.getRuntime();

     5          System.out.print(rt.freeMemory());

     6          System.out.println("/" + rt.totalMemory());

     7          long start = System.currentTimeMillis();

     8          StringBuffer a = new StringBuffer("a");

     9          for(int i=0; i < 30000; i++) {

    10              a.append("a");

    11          }

    12          long stop = System.currentTimeMillis();

    13          System.out.println(stop - start);

    14          System.out.print(rt.freeMemory());

    15          System.out.println("/" + rt.totalMemory());

    16      }

    17

18       }

 

테스트 결과

 

String

1830448/2031616

41800            -> 총 소요시간(단위: ms)

967576/2031616

 

StringBuffer

1830336/2031616

30               -> 총 소요시간(단위: ms)

1673200/2031616

 

시간 차이도 많이 났지만, 메모리 사용량도 상당한 차이가 있었습니다. 이와 함께 더 큰 문제는 이 작업이 많아질 수로 가비지 콜렉션에 의해 String을 사용하는 경우에 시간에 휠씬 큰 차이로 많이 소요된다는 것입니다.

String클래스와 StringBuffer클래스의 차이점

 

* String은 문자열의 내용이 조금이라도 바뀌거나 스트링 컨케트네이션되면 새로운

  객체를 만든다.

  레퍼런스를 잃어버린 객체는 가비지 컬렉션의 대상이 되며 새로운 객체에  새 주소를

  주므로 해쉬코드도 변한다. Immutable한 특징도 가지고 있다.

 

* StringBuffer는 원래 있던 객체의 내용만 바뀌는 Mutable한 특징이 있다.

 

  Mutable : 변덕스러운.

  Immutable : 불변의.

 

StringBuffer 안의 모든 문자열을 지우고 싶을때

 

StringBuffer sb = new StringBuffer();
sb.append("안녕하세요.abc");
sb.delete(0, sb.length());

 

 

무심코 쓰고 있는것들, 하지만 왜~ 쓰냐 ? 를 알아가는것이 중요..!


번호 제목 글쓴이 날짜 조회 수
143 숫자 에 대응 되는 패턴의 형식화 #1 황제낙엽 2008.07.08 359
142 숫자를 통화 표기 형태로 변환하기 황제낙엽 2008.07.08 348
141 NumberFormat, DecimalFormat 사용예 황제낙엽 2008.07.08 402
140 파일의 내용을 읽어 String 객체로 만드는 함수 황제낙엽 2008.06.17 296
139 UTF형태 파일에서 BOM 제거하기 황제낙엽 2008.06.16 2243
138 불러온 txt파일의 Encoding을 알 수는 방법좀 가르쳐 주세요~ 황제낙엽 2008.06.16 388
137 FileFilter, FilenameFilter 클래스를 이용한 파일 또는 디렉토리 리스트 추출하기 황제낙엽 2008.06.16 493
136 정규식 사용예제 [2] 황제낙엽 2008.06.11 384
135 정규식 사용예제 [1] 황제낙엽 2008.06.11 436
» StringBuffer vs String 황제낙엽 2008.06.10 314
133 작지만 강력한 HTML 파서, HtmlCleaner, html parser 황제낙엽 2008.06.10 398
132 Jericho HTML Parser 황제낙엽 2008.06.10 556
131 JTidy(HTML Parser) How to 황제낙엽 2008.06.10 438
130 NekoHTML 샘플 예제 황제낙엽 2008.06.09 427
129 YGHTML Parser 0.1.1 샘플 예제 황제낙엽 2008.06.09 358
128 HTML Paser 의 종류 황제낙엽 2008.06.09 710
127 File 생성시 encoding 지정하기 (Unicode/utf-8 file 읽고 쓰기) 황제낙엽 2008.05.22 756
126 java String.replaceAll (String regex, String replacement) 쓸떄 조심할 것 황제낙엽 2008.05.22 424
125 java String.replaceAll 잘쓰기 황제낙엽 2008.05.22 429
124 간단한 DBConnection 프로그램 (JDBC) file 황제낙엽 2008.05.15 456