当一个方法返回一个String时,它将是文字还是String对象?

问题描述

让我们说一个方法返回一个字符串

String str = methodCall();

methodCall()的返回类型为String。

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

解决方法

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

这个问题是基于一个误解。

在运行时,每个 Java字符串均表示为java.lang.String对象。这包括字符串文字。实际上,(通常)不可能将源自字符串文字的String对象与源自其他方式的字符串区别开来。

所以...基本上...标题中的问题没有道理。


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

  1. 这取决于您要创建的字符串的创建方式。

  2. 并非字符串池中的所有对象都源自字符串文字。

  3. 可以通过调用String.intern将字符串添加到字符串池。字符串文字确定大小后,JVM会自动执行此操作,但在任何其他情况下JVM不会自动执行。

因此,对以上方法的回答将是,如果方法返回的字符串对象以字符串文字开始生活,或者某个应用程序代码通过调用String.intern将该字符串对象放入其中,则该方法将位于字符串池中。


最后,请注意,字符串池在很大程度上与现代JVM上的现代Java应用程序无关:

  • 从Java 7开始,字符串池不再是单独的堆区域。
  • 从Java 8开始,GC本身更有效地执行字符串空间优化(重复数据删除);参见https://openjdk.java.net/jeps/192

调用String.intern始终是一个相当可疑的优化,因为应用程序几乎不可能准确预测字符串对象的生存期。阻止字符串的缺点是/,因为字符串池索引使用内存,并为垃圾收集器增加了工作量。

,

我认为这取决于methodCall()字符串。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...