我看到声明说:
String a = new String("1");
创建 2 个对象,都在堆上,一个被 a 引用,一个从字符串字面量池中引用
但是,怎么样:
String a = Integer.toString(1);
它会创建 2 个对象还是 1 个?我认为它会创建 2,我正确吗?
检查的来源Integer#toString(int)
。它返回一个新的 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(0, size, buf);
}
它将创建零个对象,因为 JVM 会将其优化掉;-)
换句话说:我相信这个问题的答案更多地与底层虚拟机有关,而不是与 Java 相关。
它将创建两个:一个char[]
在 的实现中Integer.toString
,然后将String
其转换为。
方法的内部实现可以创建任意多个,只要它满足方法的公共契约即可。
也就是说,看看当前的实现,唯一的附加对象(除了返回引用的字符串)是:
char[] buf = new char[size];
在 OpenJdk 实现中,创建一个char
数组,然后从中创建一个字符串。
第一次:
String a = new String("1");
执行它会创建至少两个如果不是更多的对象。显然它将创建一个String
,其中可能包含一个private
char[]
. 地图中还会有一个新条目,intern
其中可能包含多个对象。所以 - 总之 - 至少两个,也许四个甚至更多。
从那时起 - 但是,它应该只创建一个对象,即String
. char[]
将从实习生地图共享。
每次执行
String a = Integer.toString(1);
您将创建至少一个对象。显然String
,可能是一个新的char[]
,可能没有别的。char[]
如果它使用intern
上面创建的“1”的 ed 版本,您甚至可能不会创建。
一般来说-它取决于JVM。
案例一创建了三个对象(char[]、String constant 和 new String),而不是两个。案例二创建两个对象(char[] 和 new String)。检查了 JRE 1.7.0_21 源,其他 JRE 可能会以不同的方式实现它。