3

がタイプであるか、オブジェクトsb.indexOf(c + "") であるかを実行する際にパフォーマンスのオーバーヘッドがありますか?cCharactercharsbStringBuilder

4

2 に答える 2

5

使用できますString.valueOf

builder.indexOf(String.valueOf(c));

このアプローチには良い点があります。

  1. きれいなコード
  2. 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呼び出しにより、コードがより明確になります。これが主なことです。

于 2012-10-21T07:39:30.733 に答える
0

JavaのStringandStringBuilder/StringBufferクラスは、パターンファーストの正確な文字列照合アルゴリズムのブルートフォースメソッドを使用します。このアルゴリズムでは、テキストのすべての位置でパターンの発生をチェックし、ある位置から開始して1つの位置だけ移動するため、パフォーマンスの点で同じであるとString.indexOf感じます。StringBuilder.indexOf

ただし、StringクラスにはメソッドindexOf(char c)があり、メソッドがあるため、で文字を検索する場合は、最初に文字をStringにキャストする必要があります。あなたの例では、それがおそらく唯一のオーバーヘッドです。StringBuilder/StringBufferindexOf(String s)StringBuilder

注:StringクラスとStringBuilderクラスで採用されているブルートフォースアルゴリズムは、中小規模のテキストを処理する場合は十分ですが、大きなドキュメントを処理する場合は、より高度な検索文字列検索アルゴリズムを使用することをお勧めします。

于 2012-10-21T08:10:14.780 に答える