Java字符串分割和查找优化

来源:互联网 发布:炒黄金数据软件 编辑:程序博客网 时间:2024/05/19 16:50

字符串的分割和查找在实际软件开发过程中用的比较多,下面,主要介绍三种字符串的分割方法,比较它们之间的效率。
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方法是个不错的选择。

0 0
原创粉丝点击