6

重複の可能性:
Java で文字列の文字を反復処理する最も簡単/最良/最も正しい方法は何ですか?

私が考えているのは、時間と効率です。これらを念頭に置いて、文字列の各文字を処理する最も効率的な方法 (以下の方法または言及されていない方法) はどれですか?

String str = "Foo Bar";
for(int i=0;i<str.length();i++)
   System.out.println(str.charAt(i)); // access the character using .charAt()

for(char letter: str.toCharArray)
   System.out.println(letter);       // use for-each loop with the char array.

繰り返しますが、これを行うためのより良い方法があるかもしれませんが、上記の 2 つの間に大きな時間/リソースの違いがあるかどうかも知りたいです。

4

2 に答える 2

11

最初のバージョンはより効率的です。コードの 2 番目のバージョンは、新しく作成char[]してtoCharArray().

長い文字列 (およそ 512 文字以上) の場合、文字列を検査する最も速い方法は、リフレクションを使用して のバッキングにアクセスすることですchar[](ただし、コンパクトStringな文字列のため、Java 8 までしか機能しません)。

String data = "a really long string";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] chars = (char[]) field.get(data);

for (int i = 0, n = chars.length; i < n; i++)
    System.out.println(chars[i]);

上記のアプローチを使用することで、新しい を作成する必要性を完全に回避でき、各反復でchar[]追加のメソッド呼び出しのコストを支払うこともできました。charAt()

この投稿を見てください。回答には詳細なベンチマークが含まれています。両方の世界で最高ですが、とにかくそれはハックであり、もはや機能しません.

于 2012-11-09T01:03:08.167 に答える
1

toCharArray最初の方法は、何かを返す前に文字列の内部文字配列をコピーする必要があるため高速ですがcharAt、この内部配列の要素に直接アクセスするため、より効率的です。

つまり、charAtisO(1)toCharArrayisO(n)です。さて、文字列をトラバースするこれらの方法は両方とも になりますO(n)が、2 番目の方法は最初の方法よりも「先行係数」が高くなります。

クラスのソース コードを見れば、これらすべてを確認できます。String

于 2012-11-09T01:01:14.027 に答える