使用new关键字创建String会生成多少对象?存储在堆还是堆与SCP中?
字符串对象创建数量的疑问
String str1 = new String("Hello");
假设字符串常量池(SCP)和堆中均无任何String对象实例,"Hello"此前也未在堆或SCP中存在,执行该行代码时会创建多少个对象?
目前存在两种不同观点:
- 仅在堆中创建1个对象
- 同时在堆和字符串常量池中创建,共2个对象
两种观点的依据
仅堆中1个对象的观点
当使用new String("Hello")语法时,字符串常量池不会自动为字面量"Hello"创建String对象实例,只有当代码直接引用字面量(如String s = "Hello")或显式调用intern()方法时,常量池中才会生成对应的String对象。现代JDK中,new String()仅会在堆中创建新的String对象,其底层会复用字面量对应的字符/字节数组,但不会触发常量池的对象创建。共2个对象的观点
早期部分资料认为,代码中出现字符串字面量时,JVM会先在常量池中创建该字面量的String对象,再通过new String()在堆中拷贝一个新对象,因此总数为2。这种说法多基于旧版JDK行为或对JVM规范的误解。
准确结论
在JDK 7及以后的标准实现中(此时字符串常量池已移至堆内存),执行该行代码只会在堆中创建1个String对象。常量池中的字面量仅以符号形式存在,不会自动实例化为String对象;只有当后续调用str1.intern()时,才会将堆中该对象的引用存入常量池(若常量池无对应条目)。
内容的提问来源于stack exchange,提问作者Sriram prasanth
相关产品推荐
相关产品推荐

