问题描述
String str = methodCall();
methodCall()的返回类型为String。
我们会得到一个字符串文字,它将存储在池内存中还是一个String对象?
解决方法
当方法返回String时,它是文字还是String对象?
这个问题是基于一个误解。
在运行时,每个 Java字符串均表示为java.lang.String
对象。这包括字符串文字。实际上,(通常)不可能将源自字符串文字的String
对象与源自其他方式的字符串区别开来。
所以...基本上...标题中的问题没有道理。
我们会得到一个字符串文字,它将存储在池内存中还是一个String对象?
-
这取决于您要创建的字符串的创建方式。
-
并非字符串池中的所有对象都源自字符串文字。
-
可以通过调用
String.intern
将字符串添加到字符串池。字符串文字确定大小后,JVM会自动执行此操作,但在任何其他情况下JVM不会自动执行。
因此,对以上方法的回答将是,如果方法返回的字符串对象以字符串文字开始生活,或者某个应用程序代码通过调用String.intern
将该字符串对象放入其中,则该方法将位于字符串池中。
最后,请注意,字符串池在很大程度上与现代JVM上的现代Java应用程序无关:
- 从Java 7开始,字符串池不再是单独的堆区域。
- 从Java 8开始,GC本身更有效地执行字符串空间优化(重复数据删除);参见https://openjdk.java.net/jeps/192
调用String.intern
始终是一个相当可疑的优化,因为应用程序几乎不可能准确预测字符串对象的生存期。阻止字符串的缺点是/,因为字符串池索引使用内存,并为垃圾收集器增加了工作量。
我认为这取决于methodCall()字符串。