我们在编码过程中,有很多字符串相关的操作,
基本上每个java程序员都知道String和StringBuffer两个在处理字符串上面有很大的效率差别,
归根结底是String是一次性开辟一段定长空间的char[],如果之后对String做修改,java是重新new一个新的String对象(char[]),然后拷贝原有对象到新对象中的。这个过程会非常消耗资源。
StringBuffer好处是默认开辟一个char[16],在修改字符串时是在char数组中添加内容,然后移动下标。当长度超过原有长度后,再开辟一段两倍于新长度+1的char[](
所以StringBuffer的高效率在于不是每次都做new char[]然后做拷贝,只有在长度不够的情况下才做,而且每次就扩展新长度的两倍。这样扩容的几率就不是很高了。
那么我们在使用了StringBuffer还有没有优化的可能呢?StringBuffer的实例化方法中提供制定初始长度的方法,那么我们在使用StringBuffer时就可以更加高效的使用它了,在可以预知的长度字符串操作时,我们就可以使用该实例化方法(new StringBuffer(newStrLen);),这样做字符串操作过程中就不会出现扩容的过程了。
-------------------------------------------------------------
上面讲到的内容,大部分人都知道了,下面讲讲字符串的另外两个方法String.slipt()和String.replaceAll(),这两个方法的执行效率也非常低,主要原因是这两个方法都是支持正则表达式的。但是我们在使用这两个方法的很多时候都是用不着正则表达式的,那么我们可以使用宝宝写的StringUtil类来处理,
StringUtil.split()和StringUtil.replace,这两个方法是直接处理String中的chra[]的,效率及其高,下面我们可以看看我的测试结果
String.slipt cost:9587
StringUtil.slipt cost:2177
String.replaceAll cost:12986
StringUtil.replace cost:3696
我们可以看到,split的方法效率在4倍以上,replace方法的效率也在将近4倍。
在我们商品属性类目属性这种有着大量循环中字符串split和replace使用的地方,如果这个的修改会有很大的提高。
[color=red]但是这里要注意一点的是String.slipt()和StringUtil.split()两个方法并不是完全相同的,在两个连续分隔符的情况下,String.split会截取出空字符,而StringUtil.split()会自动将连续的分割符抛弃。
在我同事的提醒下,还有一个注意点,StringUtil.split()只支持单个分隔符的情况。
[/color]
基本上每个java程序员都知道String和StringBuffer两个在处理字符串上面有很大的效率差别,
归根结底是String是一次性开辟一段定长空间的char[],如果之后对String做修改,java是重新new一个新的String对象(char[]),然后拷贝原有对象到新对象中的。这个过程会非常消耗资源。
StringBuffer好处是默认开辟一个char[16],在修改字符串时是在char数组中添加内容,然后移动下标。当长度超过原有长度后,再开辟一段两倍于新长度+1的char[](
int newCapacity = (value.length + 1) * 2;
),然后进行内容拷贝。
所以StringBuffer的高效率在于不是每次都做new char[]然后做拷贝,只有在长度不够的情况下才做,而且每次就扩展新长度的两倍。这样扩容的几率就不是很高了。
那么我们在使用了StringBuffer还有没有优化的可能呢?StringBuffer的实例化方法中提供制定初始长度的方法,那么我们在使用StringBuffer时就可以更加高效的使用它了,在可以预知的长度字符串操作时,我们就可以使用该实例化方法(new StringBuffer(newStrLen);),这样做字符串操作过程中就不会出现扩容的过程了。
-------------------------------------------------------------
上面讲到的内容,大部分人都知道了,下面讲讲字符串的另外两个方法String.slipt()和String.replaceAll(),这两个方法的执行效率也非常低,主要原因是这两个方法都是支持正则表达式的。但是我们在使用这两个方法的很多时候都是用不着正则表达式的,那么我们可以使用宝宝写的StringUtil类来处理,
StringUtil.split()和StringUtil.replace,这两个方法是直接处理String中的chra[]的,效率及其高,下面我们可以看看我的测试结果
String a = "asdfasdf.asdf.asdf.asd..fasd......fasdf.asdf.as.df.asdgfa.sdf.as.df.ghwrtyrtuerty.rwtgwertkqertwerg,rtujhteyujrtgklrgf.ergkaerpogekrgmer.g.ergkjseorh.srth.sekrgoserpg.";
long start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {
String aa[] = a.split("\\.");
}
System.out.println("String.slipt cost:"+(System.currentTimeMillis()-start));
start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {
String aa[] = StringUtil.split(a,".");
}
System.out.println("StringUtil.slipt cost:"+(System.currentTimeMillis()-start));
String.slipt cost:9587
StringUtil.slipt cost:2177
String.replaceAll cost:12986
StringUtil.replace cost:3696
我们可以看到,split的方法效率在4倍以上,replace方法的效率也在将近4倍。
在我们商品属性类目属性这种有着大量循环中字符串split和replace使用的地方,如果这个的修改会有很大的提高。
[color=red]但是这里要注意一点的是String.slipt()和StringUtil.split()两个方法并不是完全相同的,在两个连续分隔符的情况下,String.split会截取出空字符,而StringUtil.split()会自动将连续的分割符抛弃。
在我同事的提醒下,还有一个注意点,StringUtil.split()只支持单个分隔符的情况。
[/color]