私は次のような声明を見ました:
String a = new String("1");
2 つのオブジェクトを作成します。どちらもヒープ上にあり、1 つは a によって参照され、もう 1 つは文字列リテラル プールから参照されます。
しかし、どうですか:
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 よりも基盤となる仮想マシンに関連していると思います。
2 つ作成します。1 つchar[]
は の実装にありInteger.toString
、次にString
それを に変換します。
メソッドの内部実装は、メソッドのパブリック コントラクトを満たしている限り、必要なだけ作成できます。
とはいえ、現在の実装を見ると、唯一の追加オブジェクト (参照が返される String 以外) は次のとおりです。
char[] buf = new char[size];
OpenJdk の実装では、char
配列が作成され、そこから文字列が作成されます。
ケース 1では、2 つではなく3 つのオブジェクト (char[]、文字列定数、新しい文字列) が作成されます。ケース 2では、 2 つのオブジェクト (char[] と new String) を作成します。JRE 1.7.0_21 ソースを確認しました。他の JRE では実装が異なる場合があります。
初めて:_
String a = new String("1");
を実行すると、それ以上ではないにしても、少なくとも 2 つのオブジェクトが作成されます。明らかに が作成String
され、おそらく が含まれますprivate
char[]
。intern
マップには、複数のオブジェクトで構成されている可能性のある新しいエントリもあります。つまり、要約すると、少なくとも 2 つ、場合によっては 4 つ、またはそれ以上です。
それ以降 - ただし、1 つのオブジェクトのみを作成する必要がありますString
。char[]
インターンマップよりシェアさせていただきます。
実行するたびに
String a = Integer.toString(1);
少なくとも 1 つのオブジェクトを作成します。明らかにString
、おそらく新しいものchar[]
で、おそらく他には何もありません。上で作成した "1" の ed バージョンをchar[]
使用する場合、 を作成することさえできない場合があります。intern
一般に、JVM に依存します。