当我用StringBuffer
定义new
变量时,该字符串不会添加到字符串池中,对吗?
现在,当我定义另一个StringBuffer
但未定义new
时,我会将其定义为StrPrev.append("XXX")
突然之间。(或者说我的大学老师)。这是为什么?是什么让这个字符串突然变成字符串池字符串?
答案 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
添加到池中。
此外,字符串文字总是指同一个类的实例 串。这是因为字符串文字 - 或者更一般地说是字符串 这是常量表达式的值(§15.28) - 是“实习” 以便共享唯一的实例
加载包含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。