0

当我用 定义StringBuffer变量时new,该字符串不会添加到字符串池中,对吗?

现在,当我定义另一个StringBuffer但不使用 时new,我将其定义为StrPrev.append("XXX")突然之间。(或者我的大学老师这么说)。这是为什么?是什么让这个字符串突然变成了一个字符串池字符串?

4

4 回答 4

3

当我用 new 定义一个 StringBuffer 变量时,这个字符串不会添加到字符串池中,对吧?

创建 aStringBuffer根本不会创建 a String

现在,当我定义另一个 StringBuffer 但不使用 new 时,我突然将其定义为 StrPrev.append("XXX") 。

这完全是困惑:

  • 当你打电话时,strBuff.append("XXX")你不是在定义一个新的StringBuffer. 您正在更新引用的现有StringBuffer内容。strBuff具体来说,您正在将额外的字符添加到缓冲区的末尾。

  • 你只有在你打电话String的时候才会得到一个新的。StringBufferstrBuff.toString()

  • 仅在调用 时将 a 添加到String字符串池中。如果池中还没有相等的字符串,那只会将字符串添加到池中。intern()String

  • 表示文字的 String 对象"XXX"是字符串池的成员。但这种情况发生在加载类时(即字符串被添加到池中),而不是在您执行append调用时。

(如果您的老师告诉您 StringBuffer 将字符串放入 Java 字符串池中,他/她就错了。但是,鉴于您的描述相当混乱,我怀疑您实际上听错了或误解了您的老师真正所说的。)

于 2013-04-01T15:33:08.903 回答
1

"XXX" inStrPrev.append("XXX")是在类加载时(包含代码的类的类加载时)被实习的字符串文字。

“XXX”不是由StringBuffer.

JLS 第 3.10.5 节

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式的值的字符串(第 15.28 节) - 是“内部的”,以便共享唯一的实例

JLS 第 12.5 节

加载包含字符串文字(第 3.10.5 节)的类或接口可能会创建一个新的字符串对象来表示该文字。(如果先前已实习过相同的字符串(第 3.10.5 节),则可能不会发生这种情况。)

于 2013-04-01T15:18:30.347 回答
0

其实你的老师指的是XXX。转到 StringPool 因为所有用 java 程序编写的字符串文字在执行时都转到 StringPool ...

于 2013-04-01T15:13:40.060 回答
0

buf.append("XXX")然后是 buf.toString(),然后将其返回string到池中。池就位后,只会分配StringBuffer一个对象。

于 2013-04-01T15:25:59.773 回答