gpt4 book ai didi

java - Java中字符串的奇怪输出

转载 作者:行者123 更新时间:2023-12-02 07:44:53 25 4
gpt4 key购买 nike

Possible Duplicate:
Concatenating null strings in Java

请在下面找到代码片段

String str = null;
str = str + "hi";

System.out.println(str)

上述代码的输出为nullhi .

我认为输出将是 hi ,对输出感到非常惊讶,但无法找到其背后的原因。

有人可以解释一下吗?

最佳答案

这是因为append方法。 + 被转换为 StringBuilderStringBuffer 附加操作。

public AbstractStringBuilder append(String str) {
if (str == null) str = "null";

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

下面是为您的程序生成的字节代码

 0  aconst_null
1 astore_1 [str]
2 new java.lang.StringBuilder [16]
5 dup
6 aload_1 [str]
7 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [18]
10 invokespecial java.lang.StringBuilder(java.lang.String) [24]
13 ldc <String "hi"> [27]
15 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
18 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
21 astore_1 [str]
22 getstatic java.lang.System.out : java.io.PrintStream [37]
25 aload_1 [str]
26 invokevirtual java.io.PrintStream.println(java.lang.String) : void [43]
29 return

所以你的代码实际上被转换为 append(null) 然后 append("hi") 这就是你得到这样的输出的原因

此外,15.18.1. String Concatenation Operator + 中也清楚地记录了这一点

An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.

关于java - Java中字符串的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com