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