StringBuffer何时向字符串池添加字符串?

时间:2013-04-01 15:12:10

标签: java stringbuffer

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

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

4 个答案:

答案 0 :(得分:3)

  

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

创建StringBuffer根本不会创建String

  

现在,当我定义另一个StringBuffer而不是new时,我突然将它定义为StrPrev.append(“XXX”)。

这完全搞糊涂了:

  • 当您致电strBuff.append("XXX")时,您未定义新的StringBuffer。您正在更新StringBuffer引用的现有strBuff。具体来说,您要在缓冲区的末尾添加额外的字符。

  • 当您致电String时,您只会从StringBuffer获得新的strBuff.toString()

  • 当您在String上致电intern()时,您只需在字符串池中添加String。如果池中没有相同的字符串,那么只会将字符串添加到池中。

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

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

答案 1 :(得分:1)

StrPrev.append("XXX")中的

“XXX”是一个字符串文字,在类加载时间内插入(包含代码的类的类加载时间)。

“XXX”未被StringBuffer添加到池中。

来自JLS section 3.10.5

  

此外,字符串文字总是指同一个类的实例   串。这是因为字符串文字 - 或者更一般地说是字符串   这是常量表达式的值(§15.28) - 是“实习”   以便共享唯一的实例

来自JLS section 12.5

  

加载包含String文字的类或接口   (§3.10.5)可以创建一个新的String对象来表示该文字。   (如果之前已经实例化了相同的String,则可能不会发生这种情况   (§3.10.5)。)

答案 2 :(得分:0)

实际上你的老师指的是XXX。这是StringPool,因为在java程序中编写的所有字符串文字在执行时都会转到StringPool ......

答案 3 :(得分:0)

buf.append("XXX")后跟buf.toString(),然后将string返回到池中。有了这个池,只有一个StringBuffer对象永远是allocated