1700442621
编写高质量代码:改善Java程序的151个建议 建议55:注意字符串的位置
1700442622
1700442623
看这样一段程序:
1700442624
1700442625
public static void main(String[]args){
1700442626
1700442627
String str1=1+2+“apples”;
1700442628
1700442629
String str2=“apples:”+1+2;
1700442630
1700442631
}
1700442632
1700442633
想想看这两个字符串输出的苹果数量是否一致?如果一致,那是几个呢?
1700442634
1700442635
答案是不一致,str1的值是“3 apples”,str2的值是“apples:12”,这中间悬殊很大,只是把“apples”调换了一下位置,为何会发生如此大的变化呢?
1700442636
1700442637
这都源于Java对加号的处理机制:在使用加号进行计算的表达式中,只要遇到String字符串,则所有的数据都会转换为String类型进行拼接,如果是原始数据,则直接拼接,如果是对象,则调用toString方法的返回值然后拼接,如:
1700442638
1700442639
str=str+new ArrayList();
1700442640
1700442641
上面就是调用ArrayList对象的toString方法返回值进行拼接的。再回到前面的问题上,对于str1字符串,Java的执行顺序是从左到右,先执行1+2,也就是算数加法运算,结果等于3,然后再与字符串进行拼接,结果就是“3 apples”,其形式类似于如下计算:
1700442642
1700442643
String str1=(1+2)+“apples”;
1700442644
1700442645
而对于str2字符串,由于第一个参与运算的是String类型,加上1后的结果是“apples:1”,这仍然是一个字符串,然后再与2相加,其结果还是一个字符串,也就是“apples:12”。这说明如果第一个参数是String,则后续的所有计算都会转变成String类型,谁让字符串是老大呢!
1700442646
1700442647
注意 在“+”表达式中,String字符串具有最高优先级。
1700442648
1700442649
1700442650
1700442651
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”);
[
上一页 ]
[ :1.70044262e+09 ]
[
下一页 ]