正确使用StringBuffer的subsString()和length()方法,提高代码性能

正确使用StringBuffer的subsString()和length()方法,提高代码性能

马嘉楠 20011-11-13


共同学习,欢迎转载。转载请注明地址【http://blog.csdn.net/majianan/article/details/6965553】,谢谢O(∩_∩)O!


【注】昨天发现了一些StringBuffer的错误用法代码,特发此文。提醒自己。


StringBuffer自身已经提供了截取字符串的方法subString(),返回截取后的String。【注意】返回结果是String而不是StringBuffer。
StringBuffer同时也提供了获取长度方法length()
两者使用方法同String。



【示例代码】
StringBuffer strSubmit = new StringBuffer();
//对strSubmit的操作....

【不好的写法】
batchItemBo.set("ACC_NBR_S", strSubmit.toString().substring(0, strSubmit.toString().length()-1));

【推荐写法】
batchItemBo.set("ACC_NBR_S", strSubmit.substring(0, strSubmit.length()-1));



【错误写法分析】
strSubmit.toString().substring(0, strSubmit.toString().length()-1)

1、strSubmit.toString()创建一个新的String A保存结果,并返回。

【StringBuffer的toString()方法代码如下】

public synchronized String toString() {
	return new String(value, 0, count);
}


代码可看成 A.substring(0, strSubmit.toString().length()-1)


2、subString()方法的第二个参数  strSubmit.toString().length()-1,会再次调用StringBuffer的toString()方法创建一个新的String B。
虽然A和B的值是一样的,但实际上创建了2个String对象来存放

代码可看成 A.substring(0, B.length()-1)


3、调用String的subString()方法会第三次创建个String C来保存最终的结果。

 public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }

【结论】整个过程除了StringBuffer本身,另外创建了3个String对象。



【推荐写法分析】

 strSubmit.substring(0, strSubmit.length()-1)

 1、strSubmit.length()没有创建新的对象

 【StringBuffer的length()方法代码如下】
    public synchronized int length() {
	return count;
    }

2、strSubmit.substring()方法,创建了一个新的String对象来存放截取后的字符串。
    public synchronized String substring(int start, int end) {
        return super.substring(start, end);
    }

super=AbstractStringBuilder
【AbstractStringBuilder的subString()方法如下】
    public String substring(int start, int end) {
	if (start < 0)
	    throw new StringIndexOutOfBoundsException(start);
	if (end > count)
	    throw new StringIndexOutOfBoundsException(end);
	if (start > end)
	    throw new StringIndexOutOfBoundsException(end - start);
        return new String(value, start, end - start);
    }   
 
【结论】推荐写法,整个过程除了StringBuffer本身,只创建了1个String对象。   


【StringBuilder】

StringBuilder是J2SE 5.0才新增的类,在J2SE 5.0之前的版本若有相同的需求,则使用java.lang.StringBuffer。


事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。


在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题。


如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值