我正在做一个作业,而我遇到了以下问题。
用该toString()
方法创建的字符串对象在哪里存储在内存中?
String a = Integer.toString(10);
这是一个奇怪的(我会说很差)的面试问题,因为该问题的答案取决于JDK的实现。这种实现可能会发生变化,这不是普通人应该知道的,因为要确定这一点,您需要询问实现者或阅读其源代码。另外,从Java 7开始,字符串池(我假设这是“常量池”的意思)在堆上。因此,即使它在字符串池中,它仍然在堆中。
当前(OpenJDK 8u40-b25)String
将是在堆内存中创建的新对象:
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
因为您传递的10
不是Integer.MIN_VALUE
,String
所以创建了一个新对象。该字符串的内容是一个char
由创建的数组new
,因此存在于堆中。intern()
不会被调用,因此不会放入字符串池。
您可以测试,这是你使用的事实,让行为==
与String
小号的测试,如果它们是相同的对象,而不是相同的值。以下内容将评估为False
,因为静态Integer.toString()
方法String
每次调用时都会在堆上创建一个新对象:
Integer.toString(10) == Integer.toString(10)
如果将它们嵌入到字符串池中,它们将是同一对象(因为这就是实习的要点-每个字符串仅包含一个对象)。以下内容评估为True
:
Integer.toString(10).intern() == Integer.toString(10).intern()
请注意,这是专门针对静态Integer.toString()
方法而非所有toString()
方法的答案。Boolean.toString()
例如,从字符串池返回字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句