Java字符串分割和查找优化

字符串的分割和查找在实际软件开发过程中用的比较多,下面,主要介绍三种字符串的分割方法,比较它们之间的效率。
1、对于初学者,通常字符串的分割主要使用split方法,String对象的split()方法:
public String[] split(String regex) 传入的参数regex为正则表达式
String.split()方法使用简单,功能强大,但是,在性能敏感的系统中频繁使用这个方法是不可取的。
2、使用效率更高的StringTokenizer类分割字符串
StringTokenizer类是JDK中提供的专门用来处理字符串分割子串的工具类。它的典型构造函数如下:
public StringTokenizer(String str,String delim)
其中,str参数是要分割处理的字符串,delim是分割符号
3、更优化的字符串分割方式
使用String的两个方法indexOf和subString方法混合。
以下是三种方法的实例代码:

public static void main(String[] args) {
        String orgStr = null;
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 1000; i++)
        {
            sb.append(i);
            sb.append(";");
        }
        orgStr = sb.toString();
        //使用split方法
        long splitBegin = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++)
        {
            orgStr.split(";");
        }
        long splitOver = System.currentTimeMillis();
        System.out.println(splitOver-splitBegin);
        //使用StringTokenizer类
        long StringTokenizerBegin = System.currentTimeMillis();
        StringTokenizer st = new StringTokenizer(orgStr,";");
        for(int i = 0; i < 10000; i++)
        {
            while(st.hasMoreTokens())
            {
                st.nextToken();
            }
            st = new StringTokenizer(orgStr, ";");
        }
        long StringTokenizerOver = System.currentTimeMillis();
        System.out.println(StringTokenizerOver-StringTokenizerBegin);
        //使用String的两个方法indexOf和subString方法结合
        String tmp = orgStr;
        long indexOfsubStringBegin = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++)
        {
            while(true)
            {
                String splitStr = null;
                int j = tmp.indexOf(';'); //找到分隔符的位置
                if(j<0)  //没有分隔符存在
                    break;
                splitStr = tmp.substring(0,j); //找到分隔符,截取子字符串
                tmp = tmp.substring(j+1); //剩下需要处理的字符串
            }
            tmp = orgStr;
        }
        long indexOfsubStringOver = System.currentTimeMillis();
        System.out.println(indexOfsubStringOver-indexOfsubStringBegin);
    }

在笔者的计算机上,split方法耗时2847ms,StringTokenizer类耗时1347ms,使用String的两个方法indexOf和subString方法混合耗时452ms,很直观的可以看出,不同方法之间对字符串分割效率差别还是挺大的。
在软件开发过程中,经常会遇到一个字符串的开始和结束子串是否等于某个子串。我们通常会使用startsWith,endsWith方法实现。通过测试,发现chatAt方法效率远大于上述的两个方法;例子如下:

public static void main(String[] args) {
        String str = "abceeeeeeeeeeeeeeeeeeeeeeeeabc";
        int len = str.length();
        long charAtBegin = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++)
        {
            if(str.charAt(0)=='a' && str.charAt(0)=='b' && str.charAt(0)=='c');
            if(str.charAt(len-3)=='a' && str.charAt(len-2)=='b' && str.charAt(len-1)=='c');
        }
        long charAtOver = System.currentTimeMillis();
        System.out.println(charAtOver-charAtBegin);
        long startBegin = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++)
        {
            if(str.startsWith("abc"));
            if(str.endsWith("abc"));
        }
        long endOver = System.currentTimeMillis();
        System.out.println(endOver-startBegin);
    }

在笔者的计算机中,用charAt方法耗时16ms,而startsWith,endsWith方法耗时35ms。因此,在性能敏感的系统中,charAt方法是个不错的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值