Java会在创建时更新Strings吗



由于字符串在Java中是不可变的,这将创建3个对象,还是在内部只创建一个对象。

JVM中的执行将如何进行,它将取决于JVM实现吗?

class Main{
public static void main(String[] args) throws Exception{

String s = "FirstString" + "SecondString" + "ThirdString";
}
}

如果上面的情况在编译时解决了,下面的情况如何工作。

class Main{
public static void main(String[] args) throws Exception{

String s = "FirstString" + "SecondString" + args[0];
}
}

在本例中,

String s = "FirstString" + "SecondString" + "ThirdString";

与CCD_ 1连接的3个常数串组成一个常数表达式。这意味着编译器可以在编译时知道该表达式的确切结果,从而内联结果(即,生成的.class文件看起来就像只有一个内容为FirstStringSecondStringThirdString的常量(。

请注意,关于什么是常量表达式的确切规则并不十分直观,因此,如果感兴趣,请查看JLS以了解详细信息。

在中

String s = "FirstString" + "SecondString" + someStringVariable;

第一个连接将是"0";"塌陷";简单地转换成CCD_ 4;正常的";运行时的方式。

Java 9中运行时字符串串联的特定方式非常复杂,导致池中的相关常量条目为"FirstStringSecondStringu0001"(注意后面的u0001表示参数的位置(。但它仍然证明了该表达式中的第一个串联是在从.java.class的编译过程中解决的。

这让我们意识到,即使是

String s = "First" + "Second" + someStringVariable + "Last";

由于在这种情况下使用的常数是"FirstSecondu0001Last"

最新更新