当我用 定义StringBuffer
变量时new
,该字符串不会添加到字符串池中,对吗?
现在,当我定义另一个StringBuffer
但不使用 时new
,我将其定义为StrPrev.append("XXX")
突然之间。(或者我的大学老师这么说)。这是为什么?是什么让这个字符串突然变成了一个字符串池字符串?
当我用 定义StringBuffer
变量时new
,该字符串不会添加到字符串池中,对吗?
现在,当我定义另一个StringBuffer
但不使用 时new
,我将其定义为StrPrev.append("XXX")
突然之间。(或者我的大学老师这么说)。这是为什么?是什么让这个字符串突然变成了一个字符串池字符串?
当我用 new 定义一个 StringBuffer 变量时,这个字符串不会添加到字符串池中,对吧?
创建 aStringBuffer
根本不会创建 a String
。
现在,当我定义另一个 StringBuffer 但不使用 new 时,我突然将其定义为 StrPrev.append("XXX") 。
这完全是困惑:
当你打电话时,strBuff.append("XXX")
你不是在定义一个新的StringBuffer
. 您正在更新引用的现有StringBuffer
内容。strBuff
具体来说,您正在将额外的字符添加到缓冲区的末尾。
你只有在你打电话String
的时候才会得到一个新的。StringBuffer
strBuff.toString()
仅在调用 时将 a 添加到String
字符串池中。如果池中还没有相等的字符串,那只会将字符串添加到池中。intern()
String
表示文字的 String 对象"XXX"
是字符串池的成员。但这种情况发生在加载类时(即字符串被添加到池中),而不是在您执行append
调用时。
(如果您的老师告诉您 StringBuffer 将字符串放入 Java 字符串池中,他/她就错了。但是,鉴于您的描述相当混乱,我怀疑您实际上听错了或误解了您的老师真正所说的。)
"XXX" inStrPrev.append("XXX")
是在类加载时(包含代码的类的类加载时)被实习的字符串文字。
“XXX”不是由StringBuffer
.
此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式的值的字符串(第 15.28 节) - 是“内部的”,以便共享唯一的实例
加载包含字符串文字(第 3.10.5 节)的类或接口可能会创建一个新的字符串对象来表示该文字。(如果先前已实习过相同的字符串(第 3.10.5 节),则可能不会发生这种情况。)
其实你的老师指的是XXX
。转到 StringPool 因为所有用 java 程序编写的字符串文字在执行时都转到 StringPool ...
buf.append("XXX")
然后是 buf.toString(),然后将其返回string
到池中。池就位后,只会分配StringBuffer
一个对象。