这个生成了多少个Java对象 – 新的String(“abcd”)

String s = new String("abcd"); 

实习池中有一个字符串,每次运行代码时都会重复使用。

然后是每次运行该行时构造的额外字符串。 例如:

 for (int i = 0; i < 10; i++) { String s = new String("abcd"); } 

最终会有11个字符串,其内容为“abcd” - 内存为1个,副本为10个。

你正在创建一个对象。 JVM将在幕后创建另一个对象,因为它实现了类加载时由常量创建的字符串,但这是一个JVM事物( 没有要求intern )。 更重要的是,您可以相当确定已完成:

 String s1 = new String("abcd"); 

一次,然后

 String s2 = new String("abcd"); 

只会创建一个对象。

JVM在类load时创建另一个(第一个) String对象:编译器将字符串放在.class文件的字符串常量区域中。 这些被读入类的常量池并在加载类时被实现。

因此,当执行该行代码时,将创建一个String 。 但是在类中包含该行的事实创建了两个:一个用于加载类时创建的常量,另一个用于该行代码。

您创建一个对象,即String =“abcd”。 你只打电话给新一次。