当前位置: 首页 > 知识库问答 >
问题:

Java字符串创建和字符串常量池

夏兴生
2023-03-14

当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。

我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道:

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

她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是否为。

在第二行,她说将“Summer”分配给summer2将其存储在常量池中,这意味着第一行的文字没有放在池中。

我的问题

  1. 第1行:构造函数中的文字“Summer”是否在调用String构造函数之前被放置在常量池中?
  2. 第2行:“Summer”是否已经存在于第2行的池中,还是插入到该行?
  3. 第2行:作者说在第2行的池子里插入了"Summer"是不是错了?

共有3个答案

欧阳博文
2023-03-14
**Code 1 - Line 1: Does the literal "Hello" in the constructor get placed in the constant pool before the String constructor is called?**

是的,因为构造函数用于实例化对象

****Code 1 - Line 2: Does "Hello" already exist in the pool at line 2 or is it inserted at this line?****

**它已经在那里了**。它不是由此行插入的。你可以像这样检查。

       String s=new String("hello");
String s1=s.intern();
String s2 = new String("hello");
String s3= s2.intern();

if (s1==s3)
{
System.out.println("true");
} if (s==s2)
{System.out.println("false");}

代码2 -第2行:作者在第2行说“夏天”放在水池里,她错了吗?

不会。summer不会被放在常量池中,因为它已经在那里了。code2-line1会将“summer”放在那里。

洪念
2023-03-14

代码1 -第1行:在调用字符串构造函数之前,构造函数中的文字“Summer”会被放入常量池吗?

是的。JLS指出:

这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串 (§15.28) - 被“扣留”,以便使用 String.intern 方法共享唯一实例。

由于该字符串是文字(因此也是常量表达式的值),因此将入。但是,分配给变量 summer 的对象不是同一个文本,它是显式创建的新字符串对象,用于复制该文本的值。

代码1-第2行:“Summer”是否已经存在于第2行的泳池中,还是插入了该行?

如上所述,它已插入。

代码2 -第2行:作者在第2行说“夏天”放在水池里,她错了吗?

不 - 虽然我同意措辞可以更清楚。

越国源
2023-03-14

简而言之,毫无疑问,

你写道,

   String summer  = new String("Summer");   //Line 1: The code creates a new String object with the value "Summer". This object is not placed in the String constant pool.

这是错误的。尤其是评论

字符串文字“Summer”现在在池中。并且在堆中创建的对象Summer

在调用字符串构造函数之前,构造函数中的文字“Summer”会被放在常量池中吗?

是的。它进入池,因为它是字符串文字。

“夏天”是已经存在于第2行的池中,还是插入到该行?

不,因为你没有实习,所以有两个字。(阅读更多关于String实习生的信息)

当作者说“夏天”放在第二行的游泳池里时,她错了吗?

另一条是正确的。

为了纪念,我们甚至可以简单地说“”之间的所有内容都会进入池,而不管它在哪里使用。

 类似资料:
  • 如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我

  • 本文向大家介绍字符型常量和字符串常量的区别相关面试题,主要包含被问及字符型常量和字符串常量的区别时的应答技巧和注意事项,需要的朋友参考一下 形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小:字符常量只占2个字节; 字符串常量占

  • 问题内容: 在C ++中,创建多行字符串的最佳规范方法是创建相邻字符串,并让编译器在编译时将它们连接起来,如下所示: 在Java中,我唯一知道的方法是串联: 问题是,这是在运行时生成单个字符串,还是Java实际上也在编译时进行连接?出现此问题的原因是由于以下行为: 问题答案: String s3 = “a”; s3 += “bc”; 与: 因此,它创建了一个新实例。 您甚至可以尝试:

  • 问题内容: 这与Java字符串常量池有关。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说Java字符串将存储在Constant池中,并且不会被VM重新启动或加载了String Quits的ClassLoader破坏。 如果是这种情况,我的密码将存储在字符串池中。我非常关心这个问题。还有其他方法可以销毁这些文字或我可以做的其他任何事情。 请对此提出建议, 问候,阳光明媚。 问题

  • 看完这些讨论——问题1,问题2,文章 我对Java字符串常量池有以下理解(如果我错了,请纠正我): 编译源代码时,编译器会在我们的程序中查找所有字符串文字(放在双引号中的那些),并在堆区域中创建不同的(无重复)对象,并在称为字符串常量池(方法区域内的区域)的特殊内存区域中维护它们的引用。任何其他字符串对象都是在运行时创建的。 假设我们的代码有以下语句: 当编译上述代码时, 第1行:在堆中创建一个S

  • 问题内容: 我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。 我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象: 我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一