小优化,带来大收获-String类的效率问题

我们在编码过程中,有很多字符串相关的操作,

基本上每个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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值