【问题标题】:JAVA : How many Objects will be created ? why? [duplicate]JAVA:将创建多少个对象?为什么? [复制]
【发布时间】:2015-10-01 10:55:26
【问题描述】:

我正在通过SCJP考试,发现一本书中有一行。

String s = new String("abc");

上面写着,将在上面一行创建两个对象。一个在HEAP,一个在STRING POOL

我对那里的声明不满意。有人可以让我理解为什么要创建两个对象吗?

提前致谢。

【问题讨论】:

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

标签: java string heap-memory string-pool


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    文字"abc" 被创建和实习(“字符串池”)。

    new 运算符将创建一个未实习的新 String

    【讨论】:

      【解决方案3】:

      作者是正确的:

      • 将在字符串池中为“abc”字面量创建一个对象;和
      • 将在堆上为 new String(...) 创建另一个对象

      【讨论】:

        【解决方案4】:

        对象 1 - "abc"

        对象 2 - new String("abc")

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-20
          • 2018-08-19
          • 2014-11-26
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 2014-08-01
          • 1970-01-01
          相关资源
          最近更新 更多