まず第一に、Integer.toString(i)
常により速いという仮定""+i
は成立しません。
最も注目に値するのi
は、 がコンパイル時定数である場合、""+i
とは反対に、同様になりString.valueOf(i)
ます。もちろん、定義が のようなものである場合final int i=16;
、読者は の使用に反対する""+i
でしょ"16"
う。final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;
しかし、 ,について話している場合は""+DEFAULT_USER
、実際の数値を含むリテラル文字列よりもはるかに明確です。また、コンパイル時の定数であることは、単なるパフォーマンスの問題ではなく、ステートメントの注釈またはcase
ラベルで文字列を使用できるようにします。switch
がコンパイル時の定数でない場合i
、必須のコンパイル済み形式はないため、原則として、コンパイラはいずれにコンパイル""+i
してもかまいませInteger.toString(i)
ん。通常の単純な (または「単純な」と呼びましょう) 実装new StringBuilder().append("").append(i).toString()
をInteger.toString(i)
バリアントまたは仮想的に最適化された Java 9 実装と比較すると、StringBuilder
のバッファーから resultString
の値配列への最終的なコピー アクションのみがパフォーマンスを発揮する可能性があります。影響はありますが、これは HotSpot JVM によって最適化される可能性があります。Java 9 ソリューションが目指すもう 1 つの問題であるStringBuilder
の初期容量は、ここでは関係ありませint
ん16
char
。
ほとんどの重要int
な値では、小数形式への変換のコストが他のコストを大幅に上回り""+i
ますInteger.toString(i)
。これは、Java 9 の実装で劇的なスピードアップを期待するべきではないことも意味します。主な操作はこれまでと同じです。
Java 9 ソリューションの最大の改善点は、コード サイズの縮小だと思います。これは、すべての文字列連結式に対して生成されるこれらの同様の呼び出しシーケンスがすべて 1 つの命令に折りたたまれるためです (これは、複数の式の連結に特に関連します)。パフォーマンスを向上させる機会は素晴らしいアドオンにすぎませんが、特に JRE 9 の最初のバージョンでは、劇的な改善は期待できません。
したがって、""+i
andInteger.toString(i)
またはの決定String.valueOf(i)
は単にスタイル上の問題 (ここでは説明しません) であり、パフォーマンスの問題ではありません。