字符串内存模型-java6
如图所示,Java中组成字符串内存模型-java6,java,string,memory-management,Java,String,Memory Management,如图所示,Java中组成字符串的实际字符实际上存储在私有最终字符值[]中字符数组 有人能帮我理解以下关于表达式String text=“Hello World”的问题吗 StringPool中实际存储了什么?我读过很多地方,它是Stringliteral。如果是这样的话,字符串对象和字符串文本之间的区别是什么,因为两者都必须有char[] 如果字符串引用被标记为常量(final),它还会存储在方法区域内的运行时常量池中吗 如前所述,实际的char[]value仅在堆上创建。因此,当对使用new操
字符串的实际字符实际上存储在私有最终字符值[]中代码>字符数组
有人能帮我理解以下关于表达式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 forintern()
对于池中实际存储的内容以及从该方法返回的内容也非常清楚。它与字符串内部的char[]
无关,因为string
实际上并不需要在其内部包含该数组,这只是它的实现细节。但正如前面提到的,StringPool不同于ConstantPool。loadconstant命令(lcd)引用常量池符号表中的常量,但如何按内存处理字符串文本、字符串对象和底层字符数组?