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