正在创建多少个对象?

在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中被告知这不正确 – 我很好奇我的理解有什么问题?

答案是堆中的1个实例和String池中的1个,就像你在面试中所说的那样。

字符串可以驻留两个空格:存储实习字符串的堆和perm gen。

String构造函数在堆中创建一个String。 字符串文字在永久代中的字符串池中创建。 可以使用String.intern()方法将堆中的字符串移动到String池中,该方法将字符串实现(即,确定对池中相等String的引用或在那里创建相等的String,如果还没有)并返回对interned String的引用。

编辑:要检查我的答案,添加System.out.println(s1 == s2); 作为每个例子的第三行。 它会在两种情况下都打印为false,certificate两个对象都有不同的内存地址。

文本"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(); } }