[JAVA 팁] 성능개선을 위한 String 관련 사용 팁 :: 소림사의 홍반장!


    ① 문자열 연결방법

        +연산자를 이용하여 문자열을 연결하게 되면 심하게 performance가 저하됩니다.

        StringBuffer클래스를 사용하면 performance가 향상됩니다.

   

        ) + 연산자에 의한 문자열연결 코드예

 

          String result = "";         

for (int i=0; i<loopNum; i++ )  {

result + =i;

          }

        ) StringBuffer클래스에 의한 문자열연결 코드예

 

          StringBuffer buf = new StringBuffer();

          for(int i=0; i<loopNum; i++) {

            buf.append(i);

          }

          String result = buf.toString();

 

        더욱이, 연결후의 문자열의 길이를 알고 있을 경우,  StringBuffer클래스 생성시에

적당한 초기값을 주면 더욱더 performance가 향상됩니다.

        StringBuffer클래스는 용량이 부족하게 되면 내부적으로 버퍼사이즈가 자동으로 변

경되나 연결후의 사이즈를  알고 있는 경우에는 초기값으로 사이즈를 주면 그러한

처리과정을 생략할 수 있습니다.

 

      ) StringBuffer buf = new StringBuffer(length);

 

       ) 문자열연결에 관한 performance 측정

                                                                                         

 

연결수: 1000

연결수 : 500

+연산자

250(ms)

7500(ms)

StringBuffer

15(ms)

20(ms)

StringBuffer(초기값有)

2(ms)

10(ms)

          CPU : Pentium 300MHz/ Memory :128M / OS : Linux/ J2SE:1.3.1

                                                                               

     StringTokenizer클래스

      

문자열을 자를 때,StringTokenizer클래스를 이용하는 것이 편하기는 하지만 문자열

이 고정되어 있는 경우에는 독자적인 Tokenizer를 사용하는것이 효율적입니다.

 

StringTokenizer클래스가 token을 반복할때, 매번 자를문자가 변경되어 있는지를

체크하기 때문입니다.

 

       ) StringTokenizer클래스를 취하는 코드예

 

         String word = "aaa,bbb,ccc,ddd,eee,fff";

 

         StringTokenizer token = new StringTokenizer(word,",");

 

         List list = new ArrayList();

        

         while(token.hasMoreTokens()) {

           list.add(token.nextToken());

         }

       

       ) 자를문자를 ,로 고정한후 token을 추출한 코드예

 

          String word = "aaa,bbb,ccc,ddd,eee,fff";

         

          List list = new ArrayList();

 

          int now=0;

          int next=0;

 

          while ( (next = word.indexOf(",",now)) > 0 )

          {

            list.add(word.substring(now,next));

            now = next + 1;

          }

       

 

        또한 StringTokenizer클래스에는 hasMoreElements() hasMoreTokens() 두개의

메소드가 있는데,  hasMoreElements()가 내부적으로 hasMoreTokens()를 호출하

므로 통상적으로 hasMoreTokens()를 이용 하도록 합니다.

 

        참고) J2SE 1.4부터 새로운 메소드가 추가된것이 있는데, SringTokenizer 클래스의

token 추출과 같은 기능의 메소드로 java.lang.String 클래스의 split()메소드를 소

개합니다.

 

          String word = "aaa,bbb,ccc,ddd,eee,fff";

          String [] result = word.split(",");



다른 카테고리의 글 목록

Dev. 자바/API 및 이론 카테고리의 포스트를 톺아봅니다