正在创建多少个对象?

时间:2012-04-06 14:50:02

标签: java string object

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

2 个答案:

答案 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,证明两个对象都有不同的内存地址。