JDK1.6字符串拼接自动生成StringBuilder
来源:互联网 发布:淘宝c店排名 编辑:程序博客网 时间:2024/05/17 03:57
JDK1.6字符串拼接
从JAVA诞生那天起,稍微“有些水平”的程序员都被告知,如果有大量的字符串连结,请不要使用字符串相加,而应该使用StringBuffer的append操作然后toString().
到了JAVA5,我们又被告诉知,StringBuilder是StringBuffer的非同步版,所以绝对大多数时候我们“更”可以用StringBuilder来代替加操作。因为一个可能被多线程访问的实例字段的StringBuffer操作的情况很少,和在方法中调用字符串连结相比1%都不到。
但是到了JAVA6,因为编译器“始终”把字符串的+连结编译成StringBuilder,所以在99%的情况,我们应该使用加操作。
理由是:
1.用加操作比其它操作看起来直观,写起来省事,JAVA6之前,即使明知道有性能问题我们还会在一些时候全使用+连结,根本原因当然是这种写法直观,简单。
publicvoid appendStr(String art) {
String show = "<" + art + ">";
}
//请注意,这里的例子只是为了说明"+"写法直观,并不是说只有常量字符串相加(常量字符串其实直接编译成一个字符串而不是append了)JAVA6才优化,那是之前的事,对于JAVA6,只要有是字符串操作的的+连结(第一个变量或常量是字符串),后面不管是常量还是变量,都会进行编译优化
public void appendStr(String art)
{
String show = (new StringBuilder("<")).append(art).append(">").toString();
}
谁要说第二种试方式美观写起来爽我一定当面抽他。打到他脑子正常为止。
2.我们有时还自觉不自觉地使用StringBuffer,而JAVA6总是把第一种形式优化为StringBuilder,在99%的情况下性能更好,除非你需要一个被多线程访问的实例字段操作。
3.特别是,有时我们自己写StringBuilder时,sb.append(line);后来想在前后加一个"<",">",于是很懒地写成sb.append("<"+line+">");这种情况非常多,但这样情况是先生成一个StringBuilder计算"<"+line+">",然后toString()
StringBuilder所append,还不如全部加操作让编译器用一个StringBuilder来append.
当然,循环中加操作千万不要这么做(这种需求除了测试,实际应用可能是万分之一的机会吧?),编译器虽然会优化编译,但它是在循环内部生成 StringBuilder而不是在外部。这种情况一定要自己在外部手工定义StringBuilder而不能依赖编译器了。但绝对多数情况,也就是 99%的情况我们是 str = "axman" + new Object() +1 + "good"+.......这种方式,完全可以信任编译器来优化。
另外只有两个字符串连结时请使用concat.
For循环不要再循环里面+号拼接字符串,因为会在循环里面生成StringBuilder.
public void appendStrForOwnerStringBuffer() {
StringBuffer sb =new StringBuffer();
for (int i = 0; i< 10; i++) {
sb.append("<").append(i).append("><br>");
}
}
public voidappendstrForJVMCreateStringBuffer() {
String show ="";
for (int i = 0; i< 10; i++) {
show +="<" + i + "><br>";
}
}
Xjad反编译:
public voidappendStrForOwnerStringBuffer()
{
StringBuffer sb =new StringBuffer();
for (int i = 0; i< 10; i++)
sb.append("<").append(i).append("><br>");
}
public voidappendstrForJVMCreateStringBuffer()
{
String show ="";
for (int i = 0; i< 10; i++)
show = (new StringBuilder(String.valueOf(show))).append("<").append(i).append("><br>").toString();
}
- JDK1.6字符串拼接自动生成StringBuilder
- 利用StringBuilder拼接字符串
- StringBuilder拼接字符串
- StringBuilder字符串拼接用法举例
- 用StringBuffer/StringBuilder对字符串进行拼接
- 字符串拼接的性能问题-StringBuilder
- JAVA 拼接字符串 加号问题 + StringBuilder/StringBuffer
- java字符串拼接技巧(StringBuilder使用技巧)
- [JAVA]浅谈String, StringBuilder字符串拼接速度
- StringBuilder String string.Concat 字符串拼接速度
- C#字符串连接和StringBuilder字符串拼接性能测试
- 为什么js拼接字符串StringBuilder效率那么高
- String, StringBuffer, StringBuilder拼接字符串的执行效率比较
- 黑马程序员——StringBuilder(字符串拼接类)笔记
- Android 字符串拼接总结 String,StringBuffer与StringBuilder的区别??
- 拼接字符串的效率问题(String,StringBuffer,StringBuilder对比)
- 深入研究String StringBuffer StringBuilder 的拼接字符串
- stringBuilder - 解决拼接字符串产生的滞留性
- 通过SQL 2005 系统表监控 SQL Server 的运行状况
- linux中的IP负载均衡实现原理
- keil新建工程及编译报错——invalid redeclaration of type name "s32" 的解决
- isnan和hash_map使用问题解决方法
- Java设计模式-----代理模式
- JDK1.6字符串拼接自动生成StringBuilder
- java的几种对象解释
- 个人通讯录(一)开发数据库的辅助类
- 如何抓取QQ2010的聊天框
- VIM中的正则表达式
- js 定时刷新页面
- 模仿酷狗7(Kugou7)界面源码
- Oracle 使用分析函数实现小计合计
- 使用Firebug和FirePHP调试PHP