在以下语句中将创建多少个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)
答案是每个程序运行一个全局String对象,每个语句执行零个新String对象.这是因为Java语言规范表明表达式"abc" + "xyz"是编译时常量[0],并且在执行语句时不会创建新的String对象[1].
[0]:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313
常量表达式的示例:
Run Code Online (Sandbox Code Playgroud)"The integer " + Long.MAX_VALUE + " is mighty big."
[1]:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换以在运行时生成字符串.结果是对String对象的引用(新创建,除非表达式是编译时常量表达式(第15.28节)),它是串联的