がタイプであるか、オブジェクトsb.indexOf(c + "")
であるかを実行する際にパフォーマンスのオーバーヘッドがありますか?c
Character
char
sb
StringBuilder
2 に答える
使用できますString.valueOf
builder.indexOf(String.valueOf(c));
このアプローチには良い点があります。
- きれいなコード
- String.valueOf は、渡された char のように char[] を使用して String オブジェクトを作成する
char data[] = {c};
ため、追加の操作は必要ありません。
2
本当にマイクロ最適化であり、私は常にオプション、1
つまり「クリーンコード」を選択します。
価値のあるものとして、連結バージョンによって生成されたバイトコードを次に示します。
new #2; //class java/lang/StringBuilder
dup
invokespecial #6; //Method java/lang/StringBuilder."<init>":()V
aload_1
invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
ldc #8; //String
invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual #10; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
invokevirtual #11; //Method java/lang/StringBuilder.indexOf:(Ljava/lang/String;)I
ご覧のとおり、2 番目StringBuilder
の を作成し、2 つのappend
呼び出しを行ってからtoString
. 対照的に、ここにString.valueOf
バージョンがあります:
aload_0
aload_1
invokestatic #12; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokevirtual #11; //Method java/lang/StringBuilder.indexOf:(Ljava/lang/String;)I
Character
これは、(既に自動的にボックス化解除されてchar
) を に渡すだけString.valueOf
です。それで、それは何をしますか?JDK ソースコードを見てみましょう。
public static String valueOf(char c) {
char data[] = {c};
return new String(0, 1, data);
}
そのため、新しい 1 文字の配列を作成し、String
コンストラクターに直接渡します。より効率的になる可能性が非常に高いです。
しかし、繰り返しになりますが、これはおそらくマイクロ最適化です。String.valueOf
呼び出しにより、コードがより明確になります。これが主なことです。
JavaのString
andStringBuilder/StringBuffer
クラスは、パターンファーストの正確な文字列照合アルゴリズムのブルートフォースメソッドを使用します。このアルゴリズムでは、テキストのすべての位置でパターンの発生をチェックし、ある位置から開始して1つの位置だけ移動するため、パフォーマンスの点で同じであるとString.indexOf
感じます。StringBuilder.indexOf
ただし、String
クラスにはメソッドindexOf(char c)
があり、メソッドがあるため、で文字を検索する場合は、最初に文字をStringにキャストする必要があります。あなたの例では、それがおそらく唯一のオーバーヘッドです。StringBuilder/StringBuffer
indexOf(String s)
StringBuilder
注:StringクラスとStringBuilderクラスで採用されているブルートフォースアルゴリズムは、中小規模のテキストを処理する場合は十分ですが、大きなドキュメントを処理する場合は、より高度な検索文字列検索アルゴリズムを使用することをお勧めします。