在Java中有一个关于Stringz实例池的简单问题
如果我有这样的情况: 场景1:
String s1 = "aaa";
String s2 = new String("aaa");
然后翻转 场景2:
String s1 = new String("aaa");
String s2 = "aaa";
在每种情况下 - 在字符串池和堆中创建了多少个对象? 我假设两者都会创建相同数量的对象(2个对象 - 在String池中的每个场景中为两个行添加一个单独的“aaa”,为新的Operator创建一个对象)。 我在iview中被告知这不正确 - 我很好奇我的理解有什么问题?
答案 0 :(得分:1)
文本"aaa"
的字符串在加载类时创建并汇集,因此当你的两行执行代码时,只创建一个新的String。
要明确:两个示例仅在执行时创建一个新的String对象。在第一次使用包含字符串“aaa”的类时创建文字。
class FooBar{
void foo(){
String s1 = "aaa";//the literal already exists
String s2 = new String("aaa");//creates string for s2
}
void bar(){
String s1 = new String("aaa"); //creates string for s1
String s2 = "aaa";//the literal already exists
}
}
class Test{
public void main(String... args){
...
//first time class FooBar used in program, class with literals loaded
FooBar fb = new FooBar();
//creates one string object, the literal is already loaded
fb.bar();
//also creates one string object, the literal is already loaded
fb.foo();
}
}
答案 1 :(得分:1)
如你在面试中所说,答案是堆中的1个实例和字符串池中的1个。
Strings可以驻留两个空格:存储实习字符串的堆和perm gen。
String构造函数在堆中创建一个String。字符串文字在永久代中的字符串池中创建。可以使用方法String.intern()
将字符串中的字符串移动到字符串池中,该方法实现字符串(即,确定对池中相等字符串的引用或在那里创建相等的字符串,如果还没有)并返回对interned String的引用。
编辑:要查看我的答案,请在每个示例中添加System.out.println(s1 == s2);
作为第三行。它会在两种情况下都打印为false,证明两个对象都有不同的内存地址。