違いは何ですか、
Integer i = new Integer("42");
と
Integer i = Integer.valueOf("42");
ありがとう。
なし。Integer.java を見てください。
public static Integer valueOf(String s) throws NumberFormatException {
return new Integer(parseInt(s, 10));
}
また、JavaDoc
非常に明確に使用するnew
には、発生するたびに新しいオブジェクトを作成する必要があります。
ファクトリパターン(valueOf
)を使用すると、実装に(受け入れる必要のない)代わりに、キャッシュから作成済みのインスタンスを提供する機会が与えられます。
最初の100程度の整数は、これが報われるのに十分な頻度で発生するため、一部の実装キャッシュを聞いたことがあります。
これが最も役立つ場合は、を使用することBoolean
です。考えられる個別の値は2つしかないことがわかっているためvalueOf
、新しいオブジェクトを作成するオーバーヘッドなしに、常にこれら2つの値の1つを返します。ブール値での使用new
は合法ですが、パフォーマンスとメモリ使用量に常にオーバーヘッドが発生します。
ソース コードを見ると、違いがないことがわかります。
前者は、コンストラクターを明示的に使用して新しい整数を作成します。
後者は、ファクトリ メソッドを使用して整数を作成します (コンストラクターを呼び出すことがわかります)。
2 番目が 1 番目を呼び出すという事実は、実装の詳細であり、すべての実装に当てはまるとは限りません。場合によっては、コンストラクタを呼び出さずにキャッシュを使用することがあります ( のようにvalueOf( int i )
) 。
結果の Integer は、どちらの場合もまったく同じように動作します。
それでも、秒を次のように変更することを妨げるものは何もありません。
public static Integer valueOf(String s, int radix) throws NumberFormatException {
return valueOf( parseInt( s, radix ));// which uses the cache
}
その変更は次のリリースで実行できます (または、おそらく一部の VM がそのように実行します)。コードはアップグレード時に「自動的に」それを取得しますが、一方、コンストラクターを使用することはできません。コンストラクターを明示的に呼び出しています。