当我用new定义一个StringBuffer变量时,这个字符串不会被添加到字符串池中,对吧?
现在,当我定义另一个StringBuffer但不是使用new时,我突然将它定义为StrPrev.append("XXX") (或者我的大学老师是这样说的)。为什么会这样呢?是什么让这个字符串突然变成了string-pool字符串?
发布于 2013-04-01 23:33:09
当我用StringBuffer定义一个新变量时,这个字符串不会被添加到字符串池中,对吧?
创建StringBuffer根本不会创建String。
现在,当我定义另一个新的StringBuffer而不是使用
时,我突然将它定义为StrPrev.append("XXX")。
这完全是令人困惑的:
strBuff.append("XXX")时,你并没有定义一个新的StringBuffer。您正在更新strBuff引用的现有StringBuffer。具体地说,您是在缓冲区的末尾添加额外的字符。仅当您调用strBuff.toString().StringBuffer中获得新的String仅当您在String上调用intern()时,才会将一个添加到字符串池中。只有在池中还没有相等的字符串时,才会将字符串添加到池中。"XXX"的string对象是字符串池的成员。但这种情况发生在装入类时(即字符串被添加到池中),而不是执行append调用时。(如果您的老师告诉您StringBuffer将字符串放入Java字符串池,那么他/她就错了。但是,考虑到你相当模糊的描述,我怀疑你实际上误听或误解了你老师真正说的话。)
发布于 2013-04-01 23:18:30
StrPrev.append("XXX")中的"XXX“是在类加载时(包含代码的类的类加载时间)实例化的字符串。
"XXX“不是由StringBuffer添加到池中。
从JLS section 3.10.5
此外,String文本总是引用类string的同一实例。这是因为字符串文字--或者更一般地说,是常量表达式的值的字符串(§15.28) --被“内嵌”以便共享唯一的实例
从JLS section 12.5
加载包含字符串文字(§3.10.5)的类或接口可能会创建一个新的字符串对象来表示该文字。(如果相同的字符串之前已被截获(§3.10.5),则可能不会发生这种情况。)
发布于 2013-04-01 23:13:40
实际上,你的老师指的是XXX。因为在java程序中编写的所有字符串字面值在执行时都会转到StringPool……
https://stackoverflow.com/questions/15746018
复制相似问题