【问题标题】:Java String creation and String poolJava 字符串创建和字符串池
【发布时间】:2014-07-16 11:27:11
【问题描述】:

当使用关键字 new 创建一个字符串时,它会使用一个接受字符串字面量的构造函数创建一个新的字符串对象。

在调用 String 构造函数之前,字面量是否存储在常量池中?

String hello = new String("Hello");
String literal = "Hello";             //Does "Hello" already exist in the pool
                                      //or is it inserted at this line?

编辑

在“OCA Java SE 7 程序员 I 认证指南”中,Mala Gupta 写道:

public static void main(String[] args)
{
    String summer  = new String("Summer");   // The code creates a new String object with the value "Summer". This object is not placed in the String constant pool.
    String summer2 = "Summer"                // The code creates a new String object with the value "Summer" and places it in the String constant pool.
}

她在第一行说 new 创建的 String 对象没有存储在常量池中。这很好,但不清楚的是第一行构造函数中的文字“Summer”是否是。 在第二行中,她说将“Summer”分配给 summer2 将其存储在常量池中,这意味着第一行的文字没有被保留。

【问题讨论】:

  • 创建字符串文字的副本当然是浪费 CPU 和代码。我认为这只是出于教育目的。 ;)
  • comment 变短了。任何带有"" 的东西都会进入字符串池。

标签: java string


【解决方案1】:

无论您在哪里使用,所有字符串文字都保存在字符串池中。所以答案是肯定的。

String hello = new String("Hello");
                        >--------<  goes to pool.

但问题是 h2 不会引用 h :)

【讨论】:

  • @CraigOtis 你这是什么意思。我只是举例说明我的最后一句话。
  • @Suresh 您能否澄清一下您在池中标记为的内容是什么?是新操作符创建的对象吗?或者它是构造函数中的文字?因为这就是我所追求的:构造函数中的文字是否进入常量池?
  • @Adam Object hello 在堆中创建,文字 "Hello" 进入字符串池。对象引用和字符串字面量之间有明显的区别。
  • @Suresh 这是否意味着我在编辑中写的那本书是错误的?
  • @Adam 她说得对。存储在堆中的对象和在那里使用的字符串文字没有被实习。请参考字符串实习。
【解决方案2】:

当您在代码中写入"Hello" 时,此字符串是在编译期间创建的。 所以实际上它已经存在了,因为你也用它来创建你的new String("Hello"); 里面有"Hello"。 结论:是的。

【讨论】:

    【解决方案3】:
    String ob1 = new String("Hello");
    String ob2 = "Hello"; 
    

    第一行首先在字符串池中寻找"Hello" string,如果它在那里,它会在堆中创建相同的对象,并且我们的 ob1 引用该堆对象。如果它不存在,它也会在 Pool 中创建相同的内容,在这种情况下,ob1 指的是堆对象。 如果找到的 ob2 将引用该池对象,则第二行还会在池中寻找 "Hello" object。如果未找到,它将仅在 Pool 中创建,并且 ob2 将引用该池对象。 但是第二行永远不会在堆中创建 String 对象。保存在字符串池中的字符串对象是可重用的,但在堆中创建的字符串对象不能。

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多