有人问我在interview-问题在堆上创建了多少对象在以下创建:多少String对象都在堆
String s1= "A";
String s2= "A";
String s3= new String("A");
我回答1 - 由于与新的运营商只,创建一个字符串对象。当编译器遇到s1时,它只会在字符串文字池上创建“A”。而s1和s2指向文字池中相同的文字。但面试官说我的这个游泳池在哪里?
现在,在一定的博客,我读:
“在早期版本的Java,我想起来了,到Java 1.6字符串文字池位于堆PermGen的区域,但在Java 1.7更新其感动到主要堆区“。
因此,通过这种方式,所有3个字符串对象都在堆上创建。不是吗?
但s1和s2指向字符串文字池中相同的文字(s1 == s2为true),因此当遇到s2时不应创建单独的对象。所以以这种方式,应该只创建2个对象。
难道有人能够澄清在堆堆上创建了多少个字符串对象?我错过了什么吗?
是 - 文章的第一行:“顾名思义,String Pool是存储在Java堆内存中的字符串池”。迁移到堆的1.7中的更改发生在2011年。 –
第一行没有向字符串池添加任何内容。 “A”已经存在,因为该类已加载。它最初由编译器放入.class文件的字符串池中,并由类加载器合并。 – EJP
谢谢@EJP 5.更新答案以反映更正。应该已经睡了:) –