【发布时间】:2015-09-25 03:19:27
【问题描述】:
我在一次采访中被问到一个问题——在下面的堆上创建了多少个对象:
String s1= "A";
String s2= "A";
String s3= new String("A");
我回答 1 - 因为只使用 new 运算符,就会创建一个字符串对象。当编译器遇到 s1 时,它会简单地在字符串字面量池上创建“A”。并且 s1 和 s2 指向文字池中的相同文字。但是面试官说这个池子在哪里,让我很困惑?
现在,在某个博客中,我读到:
“在 Java 的早期版本中,我认为 Java 1.6 之前的字符串字面量池位于堆的 permgen 区域,但在 Java 1.7 更新中它移到了主堆区域。”
所以通过这种方式,所有 3 个字符串对象都在 Heap 上创建。不是吗?
但 s1 和 s2 指向字符串字面量池中的同一个字面量(s1==s2 为真),因此遇到 s2 时不应创建单独的对象。所以以这种方式,应该只创建 2 个对象。
有人能澄清一下Heap上创建了多少String对象吗?我错过了什么吗?
【问题讨论】:
标签: java string string-literals