首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议55:注意字符串的位置

关灯直达底部

看这样一段程序:


public static void main(Stringargs){

String str1=1+2+"apples";

String str2="apples:"+1+2;

}


想想看这两个字符串输出的苹果数量是否一致?如果一致,那是几个呢?

答案是不一致,str1的值是"3 apples",str2的值是"apples:12",这中间悬殊很大,只是把"apples"调换了一下位置,为何会发生如此大的变化呢?

这都源于Java对加号的处理机制:在使用加号进行计算的表达式中,只要遇到String字符串,则所有的数据都会转换为String类型进行拼接,如果是原始数据,则直接拼接,如果是对象,则调用toString方法的返回值然后拼接,如:


str=str+new ArrayList();


上面就是调用ArrayList对象的toString方法返回值进行拼接的。再回到前面的问题上,对于str1字符串,Java的执行顺序是从左到右,先执行1+2,也就是算数加法运算,结果等于3,然后再与字符串进行拼接,结果就是"3 apples",其形式类似于如下计算:


String str1=(1+2)+"apples";


而对于str2字符串,由于第一个参与运算的是String类型,加上1后的结果是"apples:1",这仍然是一个字符串,然后再与2相加,其结果还是一个字符串,也就是"apples:12"。这说明如果第一个参数是String,则后续的所有计算都会转变成String类型,谁让字符串是老大呢!

注意 在“+”表达式中,String字符串具有最高优先级。