内存中创建了多少个字符串?

com*_*der 4 java string heap concatenation string-concatenation

说我有这个String表达

String hi = "Tom" + "Brady" + "Goat"
Run Code Online (Sandbox Code Playgroud)

我知道字符串池"允许运行时通过在池中保留不可变字符串来节省内存" 字符串池

字符串池中将创建多少个字符串?

我最初的猜测是5 - ,"Tom","Brady","Goat","TomBrady","TomBradyGoat"因为操作顺序的String级联(左到右?),或者是它只是最后的结果,"TomBradyGoat",存储在字符串池?

rge*_*man 5

你在这里得到的是一个常量表达式,如JLS第15.28节所定义.

常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:

  • 原始类型的文字和String类型的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)

  • 转换为基本类型并转换为String类型(第15.16节)

  • 一元运算符+, - ,〜,和!(但不是++或 - )(§15.15.3,§15.15.4,§15.15.5,§15.15.6)

  • 乘法运算符*,/和%(§15.17)

  • 加法运算符+和 - (§15.18)

(其他可能性)

编译器确定表达式"Tom" + "Brady" + "Goat"是常量表达式,因此它将计算表达式本身"TomBradyGoat".

JVM在字符串池中只有一个字符串"TomBradyGoat".