Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在创建多少个对象?_Java_String_Object - Fatal编程技术网

Java 正在创建多少个对象?

Java 正在创建多少个对象?,java,string,object,Java,String,Object,有一个关于Java中Stringz实例池的简单问题 如果我遇到这样的情况: 情景1: String s1 = "aaa"; String s2 = new String("aaa"); 然后翻了个身 情景2: String s1 = new String("aaa"); String s2 = "aaa"; 在每种情况下-在字符串池和堆中创建了多少个对象? 我假设两者都会创建相同数量的对象(2个对象-字符串池中每个场景中的两行都有一个“aaa”,新操作符有一个)。 我在一次i

有一个关于Java中Stringz实例池的简单问题

如果我遇到这样的情况: 情景1:

String s1 = "aaa";  
String s2 = new String("aaa");  
然后翻了个身 情景2:

String s1 = new String("aaa");  
String s2 = "aaa";  
在每种情况下-在字符串池和堆中创建了多少个对象? 我假设两者都会创建相同数量的对象(2个对象-字符串池中每个场景中的两行都有一个“aaa”,新操作符有一个)。
我在一次iview中被告知这是不正确的-我很好奇我的理解有什么问题?

文本
“aaa”
的字符串是在类加载时创建和合并的,因此在执行代码的两行代码时只创建一个新字符串

需要明确的是:两个示例在执行时只创建一个新的字符串对象。文本是在第一次使用包含字符串“aaa”的类时创建的


答案是堆中有1个实例,字符串池中有1个实例,正如您在访谈中所说的那样

字符串可以驻留在两个空间:heap和perm gen,其中存储了插入的字符串

字符串构造函数在堆中创建一个字符串。字符串文字是在永久生成中的字符串池中创建的。堆中的字符串可以通过方法
String.intern()
移动到字符串池中,该方法对字符串进行实习生(即,确定对池中相等字符串的引用或在池中创建相等字符串,如果还没有),并返回对实习生字符串的引用


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

从技术上讲,您可能是对的,但您能否更详细地解释一下具体在什么时候发生的情况?您是指在这两种情况下吗?就像迈克尔说的那样,你能详细解释一下吗?事实上,这是正确的解释:请参考这次投票,以获得解释清楚的答案
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();
    }
}