书籍的误导之String

[code=Java]
对String反感的朋友千万别激动(鸡动),目的是为了纠正众多被书籍误导的朋友,
话说:很多书上都会推荐我们用String的时候不建议用连字符“+”来连接字符串,原因是效率过低,说是会创建很多的String对象,而用
StringBuilder(jdk5以后)、StringBuffer代替。我相信sun公司的人非常聪明,肯定会对使用如此频繁的String动一些手脚。
带着这个疑问仔细研究一下是否真的会创建很多String对象而导致低效,结果发现,在sun的jdk中这个说法是不成立的,其他jdk没有测试过,
sun公司的早就考虑到这个问题,String是开发过程中使用非常频繁,使用+连接字符串也是非常方便的,要知道java代码的编译成class文件的时候
,编译器都会对代码进行优化,从而提高代码质量.
我测试使用的是jdk1.6

该例中会把System.out.println(a+b);
优化成System.out.println(new StringBuilder().apend(a).apend(b).toString())
由于StringBuilder是1.5以后才有,要指定jdk编译的版本号是1.5以后的才会优化成StringBuilder,1.5之前的版本都是优化成StringBuffer
使用javac编译的时候加个 -sourse 版本号 (例如1.5)   ,版本号不能低于1.2,之前不支持
可见用连字符“+”来连接字符串并没有给程序带来低效(说低效的人不知道能不能拿出证明!为什么传得全球满天飞,我真希望是自己理解错了)


源代码:

 

编译源代码(编译版本号:1.6),这个时候用StringBuilder代替
javac -source 1.6 StringTest.java
用javap 查看生成的字节码
执行
javap -verbose StringTest


如下class指令如果看不懂的话可以先看一下
http://blog.csdn.net/wzju64676266/archive/2010/09/10/5874703.aspx
java虚拟机规范  对字节码有详解

 

 


如上的代码是指定jdk是1.5版本编译出来的class文件,那现在来看一下用1.4以前版本编译的class文件吧
编译源代码(编译版本号:1.4),这个时候用StringBuffer代替,不同的地方就是把StringBuilder改成StringBuffer
javac -source 1.4 StringTest.java
用javap 查看生成的字节码
执行
javap -verbose StringTest


其他地方都相同的
看main方法的代码


由此可见,编译器都做了优化,那为什么说用“+”会创建比StringBuilder、StringBuffer效率低呢?
这个说法源头是哪里来的

 

但如果在循环中用“+”,有多少个循环就是生成多少个StringBuilder、StringBuffer

例如

String a="Hello ";
String b="World";
for(int i = 0; i < 1000; i++){
  a += b; //这样会把中间的结果 toString() 成字符串,下次循环是又要 new StringBuilder(),再又 toString()
}

[/code]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值