打字猴:1.70044265e+09
1700442650
1700442651
1700442652 编写高质量代码:改善Java程序的151个建议 [:1700438126]
1700442653 编写高质量代码:改善Java程序的151个建议 建议56:自由选择字符串拼接方法
1700442654
1700442655 对一个字符串进行拼接有三种方法:加号、concat方法及StringBuilder(或StringBuffer,由于StringBuffer的方法与StringBuilder相同,文中不再赘述)的append方法,其中加号是最常用的,其他两种方式偶尔会出现在一些开源项目中,那这三者之间有什么区别吗?我们来看下面的例子:
1700442656
1700442657 //加号拼接
1700442658
1700442659 str+=“c”;
1700442660
1700442661 //concat方法连接
1700442662
1700442663 str=str.concat(“c”);
1700442664
1700442665 上面是两种不同的字符串拼接方式,循环5万次后再检查其执行的时间,加号方式的执行时间是1438毫秒,而concat方法的执行时间是703毫秒,时间相差1倍,如果使用StringBuilder方式,执行时间会更少,其代码如下:
1700442666
1700442667 public static void doWithStringBuffer(){
1700442668
1700442669 StringBuilder sb=new StringBuilder(“a”);
1700442670
1700442671 for(int i=0;i<50000;i++){
1700442672
1700442673 sb.append(“c”);
1700442674
1700442675 }
1700442676
1700442677 String str=sb.toString();
1700442678
1700442679 }
1700442680
1700442681 StringBuffer的append方法的执行时间是0毫秒,说明时间非常非常短暂(毫秒不足以计时,读者可以使用纳秒进行计算)。这个实验也说明在字符串拼接方式中,append方法最快,concat方法次之,加号最慢,这是为何呢?
1700442682
1700442683 (1)“+”方法拼接字符串
1700442684
1700442685 虽然编译器对字符串的加号做了优化,它会使用StringBuilder的append方法进行追加,按道理来说,其执行时间也应该是0毫秒,不过它最终是通过toString方法转换成String字符串的,例子中“+”拼接的代码与如下代码相同:
1700442686
1700442687 str=new StringBuilder(str).append(“c”).toString();
1700442688
1700442689 注意看,它与纯粹使用StringBuilder的append方法是不同的:一是每次循环都会创建一个StringBuilder对象,二是每次执行完毕都要调用toString方法将其转换为字符串—它的执行时间就是耗费在这里了!
1700442690
1700442691 (2)concat方法拼接字符串
1700442692
1700442693 我们从源码上看一下concat方法的实现,代码如下:
1700442694
1700442695 public String concat(String str){
1700442696
1700442697 int otherLen=str.length();
1700442698
1700442699 //如果追加的字符串长度为0,则返回字符串本身
[ 上一页 ]  [ :1.70044265e+09 ]  [ 下一页 ]