在代码String s ="abc"+"xyz"中创建了多少个Java字符串对象;?

Dee*_*eep 20 java string

在以下语句中将创建多少个Java字符串对象?

String s = "abc" + "xyz"; 
Run Code Online (Sandbox Code Playgroud)

我猜三个?

Boh*_*ian 23

编译器为每个JVM启动创建1个字符串,因为编译器可以在编译时确定生成的字符串,它被实际存储并存储在JVM的字符串表中.


仅供参考,如果该语句是连接变量(在运行时无法确定),则会创建1个字符串,但它也会创建一个StringBuilder.代码将编译为:

new StringBuilder().append(abcVar).append(xyzVar).toString()
Run Code Online (Sandbox Code Playgroud)

  • 当连接两个文字时,它们会自动由编译器连接.所以这里只有一个对象.当您考虑将例如字符串分成若干行以获得可见性时,这是非常重要的优化. (7认同)
  • 如果我反编译从原始示例中的代码生成的类文件的结果,我得到:String a ="abcdef"; 我想我的编译器采用了一种捷径. (2认同)

Nay*_*uki 9

答案是每个程序运行一个全局String对象,每个语句执行零个新String对象.这是因为Java语言规范表明表达式"abc" + "xyz"是编译时常量[0],并且在执行语句时不会创建新的String对象[1].

参考

[0]:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

常量表达式的示例:

"The integer " + Long.MAX_VALUE + " is mighty big."
Run Code Online (Sandbox Code Playgroud)

[1]:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换以在运行时生成字符串.结果是对String对象的引用(新创建,除非表达式是编译时常量表达式(第15.28节)),它是串联的