replaceメソッドが指定された文字列の内容を置き換えるのではなく、文字列オブジェクトを返すという事実は少し鈍いですが、文字列がJavaでは不変であることがわかっているときはわかります。私はいくつかのコードで深くネストされた置き換えを使用して、大きなパフォーマンスのヒットを取っています。私はそれをより速くするために置き換えることができるものはありますか?Java文字列のメソッドを置き換えるより高速な代替方法はありますか?
答えて
これはStringBuilderの意味です。多くの操作を行う場合は、StringBuilder
で行い、必要なときはいつでもString
に変換してください。
StringBuilder
をこのように説明されています
を「可変の文字列をこのクラスは、StringBufferをと互換性のあるAPIを提供しますが、同期の保証なし」。
それはreplace
(とappend
、insert
、delete
ら)を持って、あなたは本当のString
にそれをモーフィングするtoString
を使用することができます。
また、スレッドセーフティを必要としない場合は、StringBuilderを使用することを忘れないでください。 –
また、StringBuilder.replaceはString.replaceとは全く異なる働きをしますので、ドロップインの代わりに使用することはできません! –
一般に、すべての文字列操作は非常に遅いです。 StringBufferの使用を検討してください。Stringクラスとまったく同じではありませんが、共通点が多く、変更可能です。
私は上記に同意します。スレッドセーフではStringBuffer、シングルスレッドではStringBuilderを使用します。
前の投稿は正しいですが、StringBuilder/StringBufferは解決策です。
しかし、メモリー内の大きな文字列で置き換えを行うことをお勧めしますか?
私はしばしばストリームとして実装されている文字列操作をしているので、文字列で置き換えてOutputStreamに送るのではなく、Stringを出力ストリームに送る瞬間に置き換えます。それはどの交換よりもはるかに高速です。
この置換によってテンプレートメカニズムを実装する場合は、これははるかに高速です。ストリーミングは、メモリ消費量が少ないので常に高速で、クライアントの速度が遅い場合は、遅いペースで生成する必要があります。
例を挙げることはできますか? –
置き換えられる文字列(XMLエスケープシーケンスなど)がある場合、特に置き換えのパターンがパターンと異なる場合は、処理の提案と同様に、FSMレクサータイプのアルゴリズムが最も効率的であるようですストリーム形式で出力が段階的に構築されます。
おそらくMatcherオブジェクトを使用して効率的に行うことができます。
String
のchar[]
を取得し、それを繰り返してください。一時的なStringBuilder
を使用してください。
パターンが見つからない場合は、繰り返してパターンを検索し、スキャンしたものをStringBuilder
に書き込み、それ以外の場合はStringBuilder
に置き換えます。
@paxdiabloの回答に加えて、StringBuffersを使用するreplaceAllの実装例です。StringBuffersは文字列より約3.7倍高速です。でReplaceAll():
コード:
public static String replaceAll(final String str, final String searchChars, String replaceChars)
{
if ("".equals(str) || "".equals(searchChars) || searchChars.equals(replaceChars))
{
return str;
}
if (replaceChars == null)
{
replaceChars = "";
}
final int strLength = str.length();
final int searchCharsLength = searchChars.length();
StringBuilder buf = new StringBuilder(str);
boolean modified = false;
for (int i = 0; i < strLength; i++)
{
int start = buf.indexOf(searchChars, i);
if (start == -1)
{
if (i == 0)
{
return str;
}
return buf.toString();
}
buf = buf.replace(start, start + searchCharsLength, replaceChars);
modified = true;
}
if (!modified)
{
return str;
}
else
{
return buf.toString();
}
}
テストケース - 出力は、以下の(デルタ1 = 1917009502; DELTA2 = 7241000026)です:
@Test
public void testReplaceAll()
{
String origStr = "1234567890-1234567890-";
String replacement1 = StringReplacer.replaceAll(origStr, "0", "a");
String expectedRep1 = "123456789a-123456789a-";
String replacement2 = StringReplacer.replaceAll(origStr, "0", "ab");
String expectedRep2 = "123456789ab-123456789ab-";
String replacement3 = StringReplacer.replaceAll(origStr, "0", "");
String expectedRep3 = "123456789-123456789-";
String replacement4 = StringReplacer.replaceAll(origStr, "012", "a");
String expectedRep4 = "1234567890-1234567890-";
String replacement5 = StringReplacer.replaceAll(origStr, "123", "ab");
String expectedRep5 = "ab4567890-ab4567890-";
String replacement6 = StringReplacer.replaceAll(origStr, "123", "abc");
String expectedRep6 = "abc4567890-abc4567890-";
String replacement7 = StringReplacer.replaceAll(origStr, "123", "abcdd");
String expectedRep7 = "abcdd4567890-abcdd4567890-";
String replacement8 = StringReplacer.replaceAll(origStr, "123", "");
String expectedRep8 = "4567890-4567890-";
String replacement9 = StringReplacer.replaceAll(origStr, "123", "");
String expectedRep9 = "4567890-4567890-";
assertEquals(replacement1, expectedRep1);
assertEquals(replacement2, expectedRep2);
assertEquals(replacement3, expectedRep3);
assertEquals(replacement4, expectedRep4);
assertEquals(replacement5, expectedRep5);
assertEquals(replacement6, expectedRep6);
assertEquals(replacement7, expectedRep7);
assertEquals(replacement8, expectedRep8);
assertEquals(replacement9, expectedRep9);
long start1 = System.nanoTime();
for (long i = 0; i < 10000000L; i++)
{
String rep = StringReplacer.replaceAll(origStr, "123", "abcdd");
}
long delta1 = System.nanoTime() -start1;
long start2= System.nanoTime();
for (long i = 0; i < 10000000L; i++)
{
String rep = origStr.replaceAll("123", "abcdd");
}
long delta2 = System.nanoTime() -start1;
assertTrue(delta1 < delta2);
System.out.printf("Delta1 = %d; Delta2 =%d", delta1, delta2);
}
あなたは、単一の文字を置き換えていますあなたのキャラクタ配列を反復することを考えてください。ただし、(事前に作成された)HashMap<Character, Character>()
を使って文字を置き換えてください。
私はこの方針を使用して、整数指数文字列をユニコードの上付き文字で変換します。
String.replace(char, char)
と比べて約2倍の速さです。この比較では、ハッシュマップの作成に関連する時間は含まれていないことに注意してください。
以下のコードは約です。一致がない場合は30倍、一致する場合は5倍速くなります。
static String fastReplace(String str, String target, String replacement) {
int targetLength = target.length();
if(targetLength == 0) {
return str;
}
int idx2 = str.indexOf(target);
if(idx2 < 0) {
return str;
}
StringBuilder buffer = new StringBuilder(targetLength > replacement.length() ? str.length() : str.length() * 2);
int idx1 = 0;
do {
buffer.append(str, idx1, idx2);
buffer.append(replacement);
idx1 = idx2 + targetLength;
idx2 = str.indexOf(target, idx1);
} while(idx2 > 0);
buffer.append(str, idx1, str.length());
return buffer.toString();
}
- 1. gsub()よりも高速な置換えのためのLua文字列のreplace()関数はありますか?
- 2. TemplateControl.ParseControlより高速な代替手段はありますか?
- 3. ioutil.ReadFileより高速な代替手段はありますか?
- 4. 高速レポートの表現事項文字列の一部を取り替えて置き換えます
- 5. Javaプログラムは、別の文字の代わりに文字を置き換える文字列を返します。
- 6. VB.NET:大きな配列 - より高速な代替?
- 7. UIWebView/Javascriptブリッジのより高速な代替手段はありますか?
- 8. 文字列内の文字と単語を何も置き換えない方法はありますか?
- 9. 文字列内である文字を別の文字に置き換えたり、逆の文字を文字列に置き換えたりします。
- 10. Java文字列内のプレースホルダを文字列変数に置き換える機能はありますか
- 11. サブストリング機能に代わるより高速な方法はありますか?
- 12. Pythonのstrftimeより高速な代替手段がありますか?
- 13. VBAで文字列の文字を置き換える最速の方法
- 14. eval()の代わりに文字列値を置き換えるためのより良い方法
- 15. PHP Markdown構文を使用するkramdownに代わるより高速な方法はありますか?
- 16. Pythonでforループをより高速に置き換える方法
- 17. 部分文字列の代替置換
- 18. のjava - メソッドが置き換える(文字、文字が)型スキャナ
- 19. php文字列の代わりに正規表現を置き換えます。
- 20. Pythonの文字列置換方法の代わりに
- 21. Pythonを使用して文字列内の部分文字列をより高速に数える方法はありますか
- 22. 多くの文字列を実行する最速の方法はJavaで置き換えます
- 23. Regexのより速い置き換え
- 24. このように文字列を効率的に切り替える方法はありますか?より効率的なものはありますか?
- 25. 別のパターンの後にSQL Serverの文字列インスタンスを置き換える方法はありますか?
- 26. ある文字列の特定の文字を同じインデックスの別の文字の文字とエレガントに置き換える方法はありますか?
- 27. ライブラリクラスを置き換える方法はありますか?
- 28. 文字列内の文字を置き換える方法
- 29. groovyのブロックを使って文字列をインクリメンタル値で置き換える方法はありますか?
- 30. 文字をJavaのループで置き換える方法は?
heh heh replace replace – ojblass
文字列を使用していますか?ばかじゃないの?バイトの配列を使用してください! – IAdapter