Java StringBuffer何时将字符串添加到字符串池?

Java StringBuffer何时将字符串添加到字符串池?,java,stringbuffer,Java,Stringbuffer,当我使用new定义StringBuffer变量时,该字符串不会添加到字符串池中,对吗 现在,当我定义另一个StringBuffer而不是new时,我突然将它定义为StrPrev.append(“XXX”)(或者我的大学老师这么说)。为什么呢?是什么让这个字符串突然变成了字符串池字符串?实际上你的老师指的是XXX。这会转到StringPool,因为java程序中编写的所有字符串文本在执行时都会转到StringPool…实际上,您的老师指的是XXX。这会转到StringPool,因为java程序中编

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


现在,当我定义另一个
StringBuffer
而不是
new
时,我突然将它定义为
StrPrev.append(“XXX”)
(或者我的大学老师这么说)。为什么呢?是什么让这个字符串突然变成了字符串池字符串?

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

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

StrPrev中的“XXX”。append(“XXX”)是在类加载时(包含代码的类的类加载时)插入的字符串文本

StringBuffer
不会将“XXX”添加到池中

从:

此外,字符串文字总是引用类的同一实例 一串这是因为字符串文字,或者更一般地说,字符串 这些是常量表达式(§15.28)的值,是“内部的” 以便共享独特的实例

从:

加载包含字符串文字的类或接口 (§3.10.5)可以创建一个新的字符串对象来表示该文本。 (如果相同的字符串以前被拘留过,则可能不会发生这种情况。) (§3.10.5)。)

StrPrev.append(“XXX”)
中的“XXX”是在类加载时(包含代码的类的类加载时)插入的字符串文字

StringBuffer
不会将“XXX”添加到池中

从:

此外,字符串文字总是引用类的同一实例 一串这是因为字符串文字,或者更一般地说,字符串 这些是常量表达式(§15.28)的值,是“内部的” 以便共享独特的实例

从:

加载包含字符串文字的类或接口 (§3.10.5)可以创建一个新的字符串对象来表示该文本。 (如果相同的字符串以前被拘留过,则可能不会发生这种情况。) (§3.10.5)。)

buf.append(“XXX”)
后跟buf.toString(),然后将
字符串返回池中。池就位后,只有一个
StringBuffer
对象。

buf.append(“XXX”)
后跟buf.toString(),然后将
字符串返回池中。池就位后,只会创建一个
StringBuffer
对象

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

创建
StringBuffer
根本不会创建
String

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

这完全令人困惑:

  • 调用strBuff.append(“XXX”)
时,您没有定义新的
StringBuffer
。您正在更新
strubuff
引用的现有
StringBuffer
。具体地说,您正在向缓冲区的末尾添加额外的字符

  • 调用
    strBuff.toString()
    时,只能从
    StringBuffer
    中获得一个新的
    字符串

  • String
    上调用
    intern()
    时,仅向字符串池添加
    String
    。只有当池中没有相等的字符串时,才会将该字符串添加到池中

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

  • (如果您的老师告诉您StringBuffer将字符串放入Java字符串池,那么他/她是错的。但是,考虑到您的描述相当混乱,我怀疑您实际上听错了或误解了老师真正说的话。)

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

    创建
    StringBuffer
    根本不会创建
    String

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

    这完全令人困惑:

    • 调用strBuff.append(“XXX”)
    时,您没有定义新的
    StringBuffer
    。您正在更新
    strubuff
    引用的现有
    StringBuffer
    。具体地说,您正在向缓冲区的末尾添加额外的字符

  • 调用
    strBuff.toString()
    时,只能从
    StringBuffer
    中获得一个新的
    字符串

  • String
    上调用
    intern()
    时,仅向字符串池添加
    String
    。只有当池中没有相等的字符串时,才会将该字符串添加到池中

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


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

    所有字符串常量都将放入该池,就像“XXX”StringBuffer从未添加到字符串池一样。在您的问题中,编译器在编译时识别文本字符串“XXX”,并将其添加到字符串池中