JAVA:将创建多少个对象?为什么?

JAVA:将创建多少个对象?为什么?,java,string,heap,string-pool,Java,String,Heap,String Pool,我正在检查SCJP,发现一本书中有一行 String s = new String("abc"); 上面写着,两个物体将被创建在这条线上。一个在堆上,一个在字符串池上 我对那里的声明不满意。有人能让我明白为什么要创建两个对象吗 提前感谢。作者是正确的。当您使用字符串文字时,该文字首先进入常量池 因此,在常量池中创建“abc” 当您使用新关键字时,会在堆上创建一个名为s的新对象。作者是正确的。当您使用字符串文字时,该文字首先进入常量池 因此,在常量池中创建“abc” 当您使用新关键字时,会在堆上

我正在检查SCJP,发现一本书中有一行

String s = new String("abc");
上面写着,两个物体将被创建在这条线上。一个在堆上,一个在字符串池上

我对那里的声明不满意。有人能让我明白为什么要创建两个对象吗


提前感谢。

作者是正确的。当您使用字符串文字时,该文字首先进入常量池

因此,在常量池中创建“abc”


当您使用新关键字时,会在堆上创建一个名为
s
的新对象。

作者是正确的。当您使用字符串文字时,该文字首先进入常量池

因此,在常量池中创建“abc”

当您使用新关键字时,会在堆上创建一个名为
s
的新对象。

文本
“abc”
将被创建并插入(“字符串池”)

new
操作符将创建一个新的
字符串
,该字符串未被插入

文本
“abc”
被创建并插入(“字符串池”)

new
操作符将创建一个新的
字符串
,该字符串未被插入

作者是正确的:

  • 将在字符串池中为“abc”文本创建一个对象;及
  • 将在堆上为新字符串(…)创建另一个对象
    • 作者是正确的:

      • 将在字符串池中为“abc”文本创建一个对象;及
      • 将在堆上为新字符串(…)创建另一个对象
        • 对象1-
          “abc”

          对象2-
          新字符串(“abc”)
          对象1-
          新字符串(“abc”)


          对象2-
          newstring(“abc”)

          如果只需要一个对象:
          String s=“abc”
          问题很奇怪。在类加载过程中,可能会创建插入字符串以及大量其他对象(即使您不执行这一行,也会有此
          “abc”
          插入)。但是,如果它以前已经被实习过(例如,您在另一个类中有一个名为
          abc
          )的方法,则在加载该类时不会创建它。然而,在执行给定行时,只创建一个新对象:new
          String
          instance。还要注意的是,这些天来,interned string pool也位于堆中。我同意在类加载或编译时在string pool中创建interned string,但在编译时或在string pool中加载类时创建的东西是否称为一个单独的对象?作者不正确。文字的字符串对象不是“在上面的行”创建的。它是在编译和类加载期间创建的。您永远无法执行该行,它仍然会被创建。如果您只需要一个对象:
          String s=“abc”
          这个问题很奇怪。在类加载过程中,可能会创建插入字符串以及大量其他对象(即使您不执行这一行,也会有此
          “abc”
          插入)。但是,如果它以前已经被实习过(例如,您在另一个类中有一个名为
          abc
          )的方法,则在加载该类时不会创建它。然而,在执行给定行时,只创建一个新对象:new
          String
          instance。还要注意的是,这些天来,interned string pool也位于堆中。我同意在类加载或编译时在string pool中创建interned string,但在编译时或在string pool中加载类时创建的东西是否称为一个单独的对象?作者不正确。文字的字符串对象不是“在上面的行”创建的。它是在编译和类加载期间创建的。您永远无法执行该行,它仍然会被创建。