본문 바로가기

Java

String.split 과 StringTokenizer의 차이

1. 차이점
split
JDK 1.4에서부터, StringTokenizer JDK 1.0에서부터 추가되었다,
split
delemeter 나눈 문자열이 빈문자열이면  문자열을 출력하지만, StringTokenizer 빈 문자열은 없앤다. 마지막 항목은 둘다 문자열일 경우 리턴시 없애는데 이를 포함시킬 경우  split limit 인자를 추가한다.

- 분해 방식
split
내부적으로 정규표현식으로 분해하고 StringTokenizer 문자열 하나하나를 분해한   다. split delemeter ^, *,| 등의 문자열일 경우 "\\" delemeter앞에 추가해주어야 한다.


2. 성능
 -
아래의 샘플의 결과
      split : 1121092
      StringTokenizer : 423797


 - 일반적인 성능 측정 결과 : 


  


Sun에서는 StringTokenizer 이용하는 것보다 String 클래스에 포함되어 있는 split() 기능을 이용하거나  Scanner 같은 다른 정규식 기반 솔루션을 이용하는 것이 좋다고 권고하는데, 실제 과는 StringTokenizer 성능이 좋다. 환경에 맞게 선택하길 바란다.


3. 테스트 샘플 코드

package client;
import java.util.StringTokenizer;

public class SplitTest {
          private static final String DELIM = "|";
         
    private static void useStringTokenizer(String input)  
    {  
        StringTokenizer st = new StringTokenizer(input, DELIM);  
        while (st.hasMoreElements()) {
          String token = st.nextElement().toString();       
          System.out.println("Split = " + token);     
        }  
    }
   
    private static void useSplit(String input)  
    {  
        String[] splitStr = input.split("\\|", 10);
        int splitLength = splitStr.length;
        for(int i = 0; i < splitLength; i++) {
            System.out.println("Split : " + splitStr[i]);
         }
        //System.out.println(Arrays.asList(fields));  
    }
   
          public static void main(String[] args) {
        String input = "1|2|3||5|||8||";  
        long start1 = System.nanoTime();
        useStringTokenizer(input);
        System.out.println(System.nanoTime() - start1);
        long start2 = System.nanoTime();;
        useSplit(input);
        System.out.println(System.nanoTime() - start2);
          }
}


4. 테스트 결과

Split = 1
Split = 2
Split = 3
Split = 5
Split = 8
StringTokenizer = 423797

Split : 1
Split : 2
Split : 3
Split :
Split : 5
Split :
Split :
Split : 8
Split :
Split :
Split = 1121092