正在创建多少个对象?
在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(); } }