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