【问题标题】:String created as literal and new operator作为文字和 new 运算符创建的字符串
【发布时间】:2015-07-06 13:54:11
【问题描述】:

当我声明一个字符串时:

String a = new String("Hello");

创建了 2 个对象。 1 个对象驻留在堆中,另一个对象驻留在字符串字面量池中。

所以当我这样做时:

String b = "Hello";

是创建了新对象还是来自字符串池的"Hello" 引用了b

【问题讨论】:

  • 这不取决于使用的语言吗?
  • @SDC,是 Java 吗?如果是,请标记它。

标签: string new-operator literals pool


【解决方案1】:

创建了一个新对象。

说明

  • new String("Hello") 在堆上创建一个对象。它不存储在字符串文字池中。更多信息here

  • String b = "Hello" 首先想从池中重用字符串"Hello",但没有。因此,它将在池中创建一个新的"Hello" 字符串对象,并将您的引用分配给它。

您可以在Java Language Specification 3.10.5 中阅读有关字符串文字的更多信息。

测试

我们可以test 指出引用指向不同的对象:

String a = new String("Hello");
String b = "Hello";
System.out.println(a == b);

按预期打印false

【讨论】:

    【解决方案2】:

    我说的是 Java 语言。我在很多地方都读过

    String a = new String("Hello") 
    

    创建 2 个对象。一个在堆中。你能告诉我另一个对象是在哪里创建的吗?

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2013-09-16
      • 2013-04-09
      • 2019-11-29
      • 2016-07-19
      相关资源
      最近更新 更多