2.8 字符串运算符

一般而言,不能对字符串执行数学运算,即便对那些看起来像数字的字符串亦是如此。下面的表达式是非法的:

  1. "Hello" - 1 "World" / 123 "Hello" * "World"

运算符 + 可用于字符串,但其所作所为可能出乎意料。用于字符串时,运算符 + 执行串接(concatenation),即首尾相连,因此 "Hello, " + "World!" 的结果为字符串 "Hello, World!"

再举一个例子。如果你声明了类型为 String 的变量 name,则表达式 "Hello, " + name 会将变量 name 的值附加在字符串 hello 的后面,从而生成个性化的问候。

鉴于对数字和字符串都定义了加法运算,因此 Java 可能执行意料之外的自动转换:

  1. System.out.println(1 + 2 + "Hello");
  2. // 输出为3Hello
  3. System.out.println("Hello" + 1 + 2);
  4. // 输出为Hello12

Java 按从左到右的顺序执行这些运算。在第 1 行中,1 + 2 等于 3,而 3 + "Hello" 的结果为 "3Hello";在第 2 行中,"Hello" + 1 的结果为 "Hello1",而 "Hello1" + 2 的结果为 "Hello12"

表达式包含多个运算符时,将根据运算顺序(order of operation)计算表达式。一般而言,Java 按从左到右的顺序执行运算(如 2.7 节所示),但对于数值运算符,Java 遵循如下的数学规则。

  • 乘除运算的优先级高于加减运算,这意味着先乘除后加减。因此 1 + 2 * 3 的结果为 7,而不是 9,而 2 + 4 / 2 的结果为 4,而不是 3

  • 运算符的优先级相同时,按从左到右的顺序执行。因此,表达式 minute * 100 / 60 先执行乘法运算;如果 minute 的值为 59,这个表达式将变为 5900 / 60,结果为 98。如果按从右到左的顺序执行这些运算,将得到错误的结果 59 * 1

  • 要想改变默认的运算优先级或对默认的运算优先级不太确定时,可使用括号。首先计算括号内的表达式,因此 (1 + 2) * 3 的结果为 9。还可用括号让表达式更容易理解,如 (minute * 100) / 60,虽然就这个表达式而言,用不用括号对结果并没有影响。

别费劲地去记运算符的优先级,尤其是除算术运算符外的其他运算符。如果表达式的含义不那么明显,可用括号让它清晰起来。