Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串连接在这里是如何工作的?_Java_String_String Concatenation - Fatal编程技术网

Java 字符串连接在这里是如何工作的?

Java 字符串连接在这里是如何工作的?,java,string,string-concatenation,Java,String,String Concatenation,字符串连接在这里是如何工作的? 因为这里的返回值是String类型,所以所有内容都应该转换为String。但是为什么它在这里打印“30Good3040morning”而不是“1020Good3040morning”。请帮忙 class StringConcatinationWorking{ public static void main(String ...args){ String s1 = 10 + 20 + "Good" + 30 + 40 + "morning";

字符串连接在这里是如何工作的? 因为这里的返回值是String类型,所以所有内容都应该转换为String。但是为什么它在这里打印“30Good3040morning”而不是“1020Good3040morning”。请帮忙

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

请记住,
+
操作符是左关联的,因此它从左到右“放置括号”字符串串联仅在至少一个操作数为
字符串时执行

请注意,像
10
30
这样的东西不是
String
s。它们是
int
literals

在放入括号后,表达式将变为:

(((((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")

加法规则适用:从左到右求值,先乘法和除法

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,这样您就可以对get的附加内容进行细粒度的控制,并且您可以忘记这些混合类型可能应用的加法和乘法规则的顺序,代码变得更具可读性和自文档化。


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