2

我看到声明说:

String a = new String("1");

创建 2 个对象,都在堆上,一个被 a 引用,一个从字符串字面量池中引用

但是,怎么样:

String a = Integer.toString(1);

它会创建 2 个对象还是 1 个?我认为它会创建 2,我正确吗?

4

7 回答 7

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);
}
于 2013-04-22T15:44:04.467 回答
3

它将创建零个对象,因为 JVM 会将其优化掉;-)

换句话说:我相信这个问题的答案更多地与底层虚拟机有关,而不是与 Java 相关。

于 2013-04-22T15:44:00.967 回答
2

它将创建两个:一个char[]在 的实现中Integer.toString,然后将String其转换为。

于 2013-04-22T15:43:20.030 回答
1

方法的内部实现可以创建任意多个,只要它满足方法的公共契约即可。

也就是说,看看当前的实现,唯一的附加对象(除了返回引用的字符串)是:

    char[] buf = new char[size];
于 2013-04-22T15:43:46.267 回答
1

在 OpenJdk 实现中,创建一个char数组,然后从中创建一个字符串。

于 2013-04-22T15:46:26.917 回答
0

一次

String a = new String("1");

执行它会创建至少两个如果不是更多的对象。显然它将创建一个String,其中可能包含一个private char[]. 地图中还会有一个新条目,intern其中可能包含多个对象。所以 - 总之 - 至少两个,也许四个甚至更多。

从那时起 - 但是,它应该只创建一个对象,即String. char[]将从实习生地图共享。

每次执行

String a = Integer.toString(1);

您将创建至少一个对象。显然String,可能是一个新的char[],可能没有别的。char[]如果它使用intern上面创建的“1”的 ed 版本,您甚至可能不会创建。

一般来说-它取决于JVM。

于 2013-04-22T15:46:03.270 回答
0

案例一创建了三个对象(char[]、String constant 和 new String),而不是两个。案例二创建两个对象(char[] 和 new String)。检查了 JRE 1.7.0_21 源,其他 JRE 可能会以不同的方式实现它。

于 2013-04-22T15:48:01.100 回答