【问题标题】:How many objects are created when we write [duplicate]我们编写时创建了多少个对象[重复]
【发布时间】:2017-11-20 19:18:52
【问题描述】:
String str=new String ("xyz");

我在某处读到 JVM 在池中创建了 2 个对象,第一个在堆中创建了第二个对象。

这是真的吗?如果为真,那么为什么 JVM 在已经存在一个对象时会创建 2 个对象,谁能解释一下?

【问题讨论】:

  • 您正在使用 new 关键字.... 将进入堆...而不是字符串池
  • 这是真的,这是真的,因为你告诉它这样做。
  • @LouisWasserman 我的问题是为什么 JVM 创建了 2 个对象
  • 因为 JVM 需要有一个 "xyz" 的对象,然后你告诉它创建另一个对象,一个副本。
  • 池无关。两个String 实例都存储在堆中,因为这就是Java 编程语言中“堆”一词的定义方式,即所有Java 对象的存储空间。字符串池仅包含对字符串实例的references。但在幕后,至少有一个数组保存实际的字符数据,而在 Java 中,数组也是对象。根据 JRE 版本,甚至可能有两个数组,但在最近的 JRE 中,数组在两个字符串之间共享。

标签: java string jvm


【解决方案1】:

是的,你是对的。它创建了两个对象。一个在字符串常量池中,另一个在堆中指向字符串池的对象。

  1. 如果我们考虑String str= "Hello" //字符串字面量,它只在字符串常量池中由JVM创建一个对象。
  2. 根据您的语法(String str = new String("xyz") //String object) JVM 创建 2 个对象。一个在字符串池中,另一个在堆中)。

如需进一步参考,请查看以下讨论: String s = new String("xyz"). How many objects has been made after this line of code execute?

【讨论】:

    【解决方案2】:

    一旦加载类,“xyz”就在常量池中 当该行实际运行时,str 被放入堆中

    Where does Java's String constant pool live, the heap or the stack?

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2020-06-06
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多