0

假设一个方法返回一个字符串

字符串 str = methodCall();

methodCall() 的返回类型是 String。

我们会得到一个字符串字面量,它会在池内存中还是只是一个字符串对象?

4

2 回答 2

8

当一个方法返回一个字符串时,它是一个字面量还是一个字符串对象?

这个问题是基于一个误解。

在运行时,每个Java 字符串都表示为一个java.lang.String对象。这包括字符串文字。事实上,(通常)不可能区分String源自字符串文字的对象和源自其他方式的对象。

所以......基本上......标题中的问题没有意义。


我们会得到一个字符串字面量,它会在池内存中还是只是一个字符串对象?

  1. 这取决于您返回的字符串是如何创建的。

  2. 并非字符串池中的所有对象都源自字符串文字。

  3. 可以通过调用将字符串添加到字符串池中String.intern。当字符串文字被具体化时,JVM 会自动执行此操作,但在任何其他情况下它不会自动执行此操作。

因此,上面的答案将是一个方法返回的字符串对象将在字符串池中,如果它以字符串文字开始,或者某些应用程序代码通过调用将它放在那里String.intern


最后,请注意字符串池在很大程度上与现代 JVM 上的现代 Java 应用程序无关:

  • 从 Java 7 开始,字符串池不再是一个单独的堆区域。
  • 从 Java 8 开始,字符串空间优化(去重)由 GC 本身更有效地执行;https://openjdk.java.net/jeps/192

调用String.intern始终是一个相当可疑的优化,因为应用程序几乎不可能准确预测字符串对象的生命周期。实习字符串的缺点是 / 是字符串池索引使用内存,并为垃圾收集器做更多工作。

于 2020-08-15T03:34:09.077 回答
0

我认为这取决于 methodCall() string 。

于 2020-08-15T03:31:04.167 回答