如何解决当一个方法返回一个String时,它将是文字还是String对象?
让我们说一个方法返回一个字符串
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()字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。