正确使用StringBuffer的subsString()和length()方法,提高代码性能
来源:互联网 发布:如何做网络写手 编辑:程序博客网 时间:2024/06/08 05:50
正确使用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,让对象自行管理同步问题。
- 正确使用StringBuffer的subsString()和length()方法,提高代码性能
- 提高String和StringBuffer性能的技巧
- 提高String和StringBuffer性能的技巧
- 提高String和StringBuffer性能的技巧
- 提高String和StringBuffer性能的技巧
- 提高String和StringBuffer性能的技巧
- 提高String和StringBuffer性能的技巧
- StringBuffer中的length和capacity方法的区别
- java StringBuffer的length()和capacity()方法比较
- ArraylList的扩容机制和使用ensureCapacity()方法提高性能
- ArraylList的扩容机制和使用ensureCapacity()方法提高性能
- Java提高:你能正确使用String、StringBuffer、StringBuilder吗
- 提高性能的方法
- 提高性能的方法
- 提高代码性能及并发性的方法浅谈
- StringBuffer中length()和capacity()的区别用法
- StringBuffer中length()和capacity()的区别用法
- Oracle sqlldr导入数据使用默认值和提高性能的方法
- 新手进入黄金市场
- shell 执行sql 文件,mysql 和 oracle 版本
- hdoj 1248(背包问题)(动态规划)
- java 通过jdbc驱动连接hive操作实例
- 准备软考——理论应用
- 正确使用StringBuffer的subsString()和length()方法,提高代码性能
- 魔术方法__set()和__get()
- Qt的Model/View (二)
- JNI学习(1)
- Jar Hell 问题解决方案
- Qt 对象数据的声明和使用
- systemverilog interface
- 导出和使用外部符号
- 使用qt命令来编译的基本步骤