当 methd 返回 String 时,它是文字还是 String 对象?

0 java garbage-collection memory-management string-pool java-heap

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

String str = methodCall();

methodCall() 的返回类型是 String。

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

Ste*_*n C 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始终是一个相当可疑的优化,因为应用程序几乎不可能准确预测字符串对象的生命周期。实习字符串的缺点是 / 是字符串池索引使用内存,并为垃圾收集器做更多的工作。