2

私は次のような声明を見ました:

String a = new String("1");

2 つのオブジェクトを作成します。どちらもヒープ上にあり、1 つは a によって参照され、もう 1 つは文字列リテラル プールから参照されます。

しかし、どうですか:

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

2 つ作成します。1 つchar[]は の実装にありInteger.toString、次にStringそれを に変換します。

于 2013-04-22T15:43:20.030 に答える
1

メソッドの内部実装は、メソッドのパブリック コントラクトを満たしている限り、必要なだけ作成できます。

とはいえ、現在の実装を見ると、唯一の追加オブジェクト (参照が返される String 以外) は次のとおりです。

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

OpenJdk の実装では、char配列が作成され、そこから文字列が作成されます。

于 2013-04-22T15:46:26.917 に答える
0

ケース 1では、2 つではなく3 つのオブジェクト (char[]、文字列定数、新しい文字列) が作成されます。ケース 2では、 2 つのオブジェクト (char[] と new String) を作成します。JRE 1.7.0_21 ソースを確認しました。他の JRE では実装が異なる場合があります。

于 2013-04-22T15:48:01.100 に答える
0

初めて:_

String a = new String("1");

を実行すると、それ以上ではないにしても、少なくとも 2 つのオブジェクトが作成されます。明らかに が作成Stringされ、おそらく が含まれますprivate char[]internマップには、複数のオブジェクトで構成されている可能性のある新しいエントリもあります。つまり、要約すると、少なくとも 2 つ、場合によっては 4 つ、またはそれ以上です。

それ以降 - ただし、1 つのオブジェクトのみを作成する必要がありますStringchar[]インターンマップよりシェアさせていただきます。

実行するたびに

String a = Integer.toString(1);

少なくとも 1 つのオブジェクトを作成します。明らかにString、おそらく新しいものchar[]で、おそらく他には何もありません。上で作成した "1" の ed バージョンをchar[]使用する場合、 を作成することさえできない場合があります。intern

一般に、JVM に依存します。

于 2013-04-22T15:46:03.270 に答える