【发布时间】:2018-06-21 04:25:40
【问题描述】:
阅读这些讨论后 - question 1、question 2、article
我对Java字符串常量池的理解如下(如有错误请指正):
编译源代码时,编译器会在我们的程序中查找所有字符串字面量(放在双引号中的字面量),并在堆区域中创建不同(无重复)的对象,并将它们的引用保存在一个名为String Constant Pool(方法区域内的一个区域)。任何其他字符串对象都是在运行时创建的。
假设我们的代码有以下语句:
String a = "abc"; //Line 1
String b = "xyz"; //Line 2
String c = "abc"; //Line 3
String d = new String("abc"): //Line 4
上述代码编译完成后,
第 1 行:在堆中创建了一个字符串对象“abc”,该对象由变量 a 和字符串常量池引用。
第 2 行: 编译器在字符串常量池中搜索对对象“xyz”的任何现有引用。但是没有找到。因此,它创建对象“xyz”并将其引用放入字符串常量池中。
第 3 行: 这一次编译器在字符串常量池中找到对象,并且不会在池或堆中添加任何额外的条目。变量 c 只是引用现有的对象,它也被 a 引用。
第 4 行: 第 4 行中的文字出现在字符串常量池中。因此,池中不再有条目。然而,在运行时会为“abc”创建另一个 String 对象,并将其引用存储在变量 d 中。
现在我有以下问题/疑问:
- 上面描述的究竟是什么情况?
- 编译器如何创建对象?据我所知,对象 在运行时创建,堆是运行时内存区域。又怎样 以及在哪里创建 String 对象 编译!
- 源代码可以在一台机器上编译并在不同的机器上运行 机器。或者,即使在同一台机器上,它们也可以编译和运行 不同的时间。然后这些对象(在编译时创建)是如何 康复了吗?
- 当我们实习字符串时会发生什么。
【问题讨论】:
-
stackoverflow.com/questions/10578984/what-is-string-interning - 当然字符串对象在机器之间是不一样的,它们在某个JVM中是一样的。 The string constant pool is not created "when the source code is compiled."
-
您能详细说明一下吗?如果您知道答案,请提供更详细的信息。链接的问题仅包含有关字符串实习的信息。但不是常量池是如何创建的。 @芒果
标签: java string memory-management compilation heap-memory