0 java garbage-collection memory-management string-pool java-heap
假设一个方法返回一个字符串
String str = methodCall();
methodCall() 的返回类型是 String。
我们会得到一个字符串文字,它会在池内存中还是只是一个字符串对象?
当一个方法返回一个字符串时,它是一个文字还是一个字符串对象?
这个问题是基于一种误解。
在运行时,每个Java 字符串都表示为一个java.lang.String对象。这包括字符串文字。事实上,(通常)不可能将String源自字符串文字的对象与源自其他方式的对象区分开来。
所以......基本上......标题中的问题没有意义。
我们会得到一个字符串文字,它会在池内存中还是只是一个字符串对象?
这取决于您返回的字符串是如何创建的。
并非字符串池中的所有对象都源自字符串文字。
可以通过调用将字符串添加到字符串池中String.intern。当字符串文字被具体化时,JVM 会自动执行此操作,但在任何其他情况下不会自动执行此操作。
因此,上述问题的答案是,如果某个方法返回的字符串对象作为字符串文字开始存在,或者某些应用程序代码通过调用String.intern.
最后,请注意字符串池在很大程度上与现代 JVM 上的现代 Java 应用程序无关:
调用String.intern始终是一个相当可疑的优化,因为应用程序几乎不可能准确预测字符串对象的生命周期。实习字符串的缺点是 / 是字符串池索引使用内存,并为垃圾收集器做更多的工作。