【问题标题】:How is string concatenation working here? [duplicate]字符串连接在这里如何工作? [复制]
【发布时间】:2019-05-20 13:14:47
【问题描述】:

字符串连接在这里如何工作? 由于这里的返回值是字符串类型,所以一切都应该转换为字符串。但是为什么在这里打印"30Good3040morning",而不是"1020Good3040morning"。请帮忙。

class StringConcatinationWorking{
    public static void main(String ...args){
        String s1 = 10 + 20 + "Good" + 30 + 40 + "morning";
        System.out.println(s1);
    }
}

【问题讨论】:

  • 不带括号的表达式是根据正常的优先规则计算的,在这种情况下只是从左到右。因此它将首先评估等于 30 的 10 + 20 部分,然后添加“Good”部分,从而产生一个 String 类型。至此,其他所有内容都将添加为字母数字部分。
  • 如果你真的需要做这样的连接,我建议使用StringBuilder。性能只会变得更好(更糟糕的是保持不变),并且会避免您现在遇到的隐式转换问题。
  • 10 不是String,是int,与其他String 连接时转换为字符串
  • 因为在 30 之前有一个字符串,所以字符串连接("Good"+30)=Good30 之后 "Good30"+40 将是 "Good3040" 并继续

标签: java string string-concatenation


【解决方案1】:

请记住,+ 运算符是左关联的,因此它从左到右“放置括号”。 仅当至少有一个操作数是String时才执行字符串连接

请注意,1030 之类的东西不是 Strings。它们是 int 文字。

你的表达式,加上括号后,变成:

(((((10 + 20) + "Good") + 30) + 40) + "morning")

如果我们从最里面的括号开始逐步评估,我们得到:

((((30 + "Good") + 30) + 40) + "morning") // 10 + 20
((("30Good" + 30) + 40) + "morning") // 30 + "Good"
(("30Good30" + 40) + "morning") // "30Good" + 30
("30Good3040" + "morning") // "30Good30" + 40
"30Good3040morning" // "30Good3040" + "morning"

注意我们如何获得10 + 20 的子表达式,而不是30 + 40 的子表达式。

要获得预期的结果,只需在 10 术语之前或之后添加一个 "" 术语,使括号变为:

((((((10 + "") + 20) + "Good") + 30) + 40) + "morning")

【讨论】:

    【解决方案2】:

    加法规则:从左到右计算,先乘除。

    10 + 20 + "Good" + 30 + 40 + "morning"
    

    看到前 10 + 20,整数 + 整数。没有看到字符串。好的,整数 30。
    然后看到一个字符串,整数+字符串。将类型更改为字符串"30" + "Good" = "30Good"
    然后至少用一个字符串看到所有内容并转换为字符串。

    要将所有内容都作为字符串,请使用 StringBuilder 并将值放入其中以获取字符串。
    或者在连接列表前面添加一个“”,以字符串开头,将所有内容都转换为字符串,除了可能的乘法或减法。

    "" + 10 + 20 + "Good" + 30 + 40 + "morning"
    

    如果您有乘法或除法,则适用相同的加法规则。这些在加法或减法之前

     10 + 20 + "Good" + 30 * 40 + "morning" == "30Good1200morning"
    
     10 + 20 + "Good" + 30 / 40 + "morning" == "30Good0morning"
    

    在这种情况下,我喜欢使用 StringBuilder,这样您就可以对附加的内容进行细粒度控制,并且您可以忘记这些混合类型可能适用的加法和乘法规则的顺序,代码变成更具可读性和自我记录。 see it online

    String newstr = new StringBuilder()
                        .append(10)
                        .append(20)
                        .append("Good")
                        .append(30)
                        .append(40)
                        .append("morning")
                        .toString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2020-05-05
      • 2014-01-23
      相关资源
      最近更新 更多