StringTokenizer和split分隔字符串效率比较

本文通过三个实验对比了Java中的StringTokenizer和split方法在不同分隔符下分隔字符串的效率。实验结果显示,对于特定的分隔符如逗号,StringTokenizer效率更高;而对于空格,split方法表现更优。实验还提到,正则表达式在某些情况下可能存在的效率问题,并提出了疑问期待解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验1:

public class TestCharacter {
private static String buildString(int length) {
        StringBuilder sb = new StringBuilder();
        Random r =new Random();
        for (int i = 0; i <length;i++ ){
            for (int j = r.nextInt(10); j>0 ;j--){
                sb.append((char)('a' + r.nextInt(30)));
            }
            sb.append(",");
        }       
        return sb.toString();
    }


public static void main(String[] args) {
String str = buildString(1000000); //1.7新特性, 1000000
long start;
       long end;
        
       System.out.println("-----------StringTokenizer start-----------");      
       start = System.currentTimeMillis();
       StringTokenizer mb = new StringTokenizer(str);
       StringBuilder sb = new StringBuilder();
       while(mb.hasMoreTokens()){
           sb.append(mb.nextToken());
       }
       end = System.currentTimeMillis();
       System.out.println("StringTokenizer time use:" + (end-start));
        
       System.out.println("-----------StringSpilt start-----------");      
       start = System.currentTimeMillis();
       StringBuilder sb2 = new StringBuilder();
       String[] strs = str.split("\\s");
       for(String s: strs){
           sb2.append(s);
       }
       end = System.currentTimeMillis();
       System.out.println("StringSpilt time use:" + (end-start));    
}
}


实验1输出结果:

-----------StringTokenizer start-----------
StringTokenizer time use:16
-----------StringSpilt start-----------
StringSpilt time use:47


说明:好像说明StringTokenize分隔字符串的效率要比spilt好一些是吧,但是为什么jdk不推荐使用这个类啦?在没弄懂这个问题之前,我一直喜欢用StringTokenize分隔字符串,感觉自己很酷。直到有一天看见别人写过一条评论后才知道,原来我用的方法不对,正则表达式\\s方法在java中是有bug的,如果要分隔字符串要换成\\t 就可以体现效率了


实验二:其他不变,把\\s改成\\t  String[] strs = str.split("\\t");

输出结果为:-

----------StringTokenizer start-----------
StringTokenizer time use:16
-----------StringSpilt start-----------
StringSpilt time use:31


说明:好像和实验一一样,依然是StringTokenizer 效率高


实验三:把分隔符的逗号(,)改成空格

private static String buildString(int length) {
        StringBuilder sb = new StringBuilder();
        Random r =new Random();
        for (int i = 0; i <length;i++ ){
            for (int j = r.nextInt(10); j>0 ;j--){
                sb.append((char)('a' + r.nextInt(30)));
            }
            sb.append("   ");  //把分隔符【,】改成空格了
        }       
        return sb.toString();
    }

输出结果:-----------StringTokenizer start-----------
StringTokenizer time use:109
-----------StringSpilt start-----------
StringSpilt time use:32

说明:尼玛,逆天改变了,正则表达式效率反而更高,说明用split区分空格符号分隔字符串效率更高,而StringTokenizer区分【,。=】等符号分隔字符串效率更高。

至于它们底层的原因,我也不太清楚,希望大神帮我解释一下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值