字符串内存模型-java6

字符串内存模型-java6,java,string,memory-management,Java,String,Memory Management,如图所示,Java中组成字符串的实际字符实际上存储在私有最终字符值[]中字符数组 有人能帮我理解以下关于表达式String text=“Hello World”的问题吗 StringPool中实际存储了什么?我读过很多地方,它是Stringliteral。如果是这样的话,字符串对象和字符串文本之间的区别是什么,因为两者都必须有char[] 如果字符串引用被标记为常量(final),它还会存储在方法区域内的运行时常量池中吗 如前所述,实际的char[]value仅在堆上创建。因此,当对使用new操

如图所示,Java中组成
字符串的实际字符实际上存储在
私有最终字符值[]中字符数组

有人能帮我理解以下关于表达式
String text=“Hello World”的问题吗

  • StringPool中实际存储了什么?我读过很多地方,它是
    String
    literal。如果是这样的话,字符串对象和字符串文本之间的区别是什么,因为两者都必须有
    char[]
  • 如果字符串引用被标记为常量(final),它还会存储在
    方法区域内的
    运行时常量池中吗
    
  • 如前所述,实际的
    char[]value
    仅在堆上创建。因此,当对使用
    new
    操作符创建的
    String
    对象调用
    intern()
    方法时,会将什么复制到StringPool(假设它不是字符数组)
  • 编辑:


    如前所述,StringPool是作为HashMap实现的。那么,同样的问题的关键和价值是什么呢?该值不能是
    char[]value
    ,因为它是在堆上创建的

    这方面没有专家,但我会试一试

    String text = "Hello World";
    

    lcd(加载常量)在常量池表中查找字符串。找到#2,地址为#14,地址为“Hello Word”

    参考:


    参考:

    String-literal主要是编译时工件。它的运行时表示形式仍然是
    String
    object.@M.Prokhorov:如果String literal只是一个编译时工件,那么当对使用new操作符创建的字符串调用intern方法时,它如何移动到StringPool,因为它根本不应该存在?解释它well@Sumit,我正在讨论字符串对象和字符串文字之间的区别:在运行时没有。在运行时,两者都只是
    String
    对象。其中一定数量的是从文本创建的,但仅此而已。Javadoc for
    intern()
    对于池中实际存储的内容以及从该方法返回的内容也非常清楚。它与字符串内部的
    char[]
    无关,因为
    string
    实际上并不需要在其内部包含该数组,这只是它的实现细节。但正如前面提到的,StringPool不同于ConstantPool。loadconstant命令(lcd)引用常量池符号表中的常量,但如何按内存处理字符串文本、字符串对象和底层字符数组?