2011-12-18 12 views
14

私はこのドキュメントページhttp://developer.android.com/reference/android/util/Log.htmlを読んでいました。Android StringBuilderと文字列の連結

セクションでは、ここに私の目を引いた。

ヒント:

Log.v(TAG, "index=" + i);

のような呼び出しを行うときに、文字列を構築しているときは中を通過することをことを忘れないでください。 Log.d、コンパイラ はStringBuilderを使用し、少なくとも3つの割り当てが発生します。つまり、 StringBuilder自体、バッファ、およびStringオブジェクトです。 現実的には、もう1つのバッファの割り当てとコピーがあり、 gcにさらに大きな負荷がかかります。つまり、ログメッセージが で除外されている場合、重要な作業をしている可能性があり、 という重大なオーバーヘッドが発生する可能性があります。

これは、Androidコンパイラが文字列連結(+)を受け取り、それをStringBuilderとappend文に変換することを意味します。

私の前提が正しいのですか、文字列連結の代わりに手動でStringBuilderを使用する方が良いですか?

+0

可能重複して[Javaで文字列の連結 - +、のStringBuilderと連結を使用する場合(http://stackoverflow.com/質問/ 7817951/string-concatenation-in-java-when-to-use-stringbuilder-concat) – givanse

答えて

9

コンパイラは、あなたが示唆していることを暗示しています。生成された.classファイルのバイトコードを(javap -cを使用して)印刷し、StringBuilderを構築して使用する呼び出しを参照できます。

ただし、文字列の連結が複数行のコードにまたがっている場合は、手動で行うのが一般的です。コンパイラは、通常、+を含む文字列値式ごとに別々のStringBuilderを割り当てます。

+0

私はこのすべてを間違っています。 >< –

+1

@JeremyEdwards - Heh。私はそれについて多くのことを言ってきました。 :) –

+2

** "文字列の連結が複数のコード行に広がっている場合、手動で行うのが一般的です。" ** - テッドホップが何を言っているのかを強調したかっただけです。私は約10行に250文字の文字列を連結し、App EngineのCPU時間は350ミリ秒でした。私がこれを単一のStringBuilderに置き換えたとき、時間は50ミリ秒まで減少しました。他のものは変更されませんでした。 –

1

テッド・ホップの答えは良いですが、理解するのに数回読んでいました。うまくいっていると言い換えられた答えがここにあります。

文字列連結(つまり、、String myString = "Hello " + "World";のように)は、他の割り当てとともにバックグラウンドでStringBuilderを使用します。したがって、単純なワンタイム連結以外のものについては、自分自身StringBuilderを使用する方が良いでしょう。例えば

StringBuilder myString = new StringBuilder(); 
myString.append("Hello "); 
myString.append("to "); 
myString.append("everyone "); 
myString.append("in "); 
myString.append("the "); 
myString.append("world!"); 

がのより良好

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!"; 
+0

しかし、私の文字列が単に "" index = "+ i"の場合、何が最善の方法ですか?(パフォーマンスのために) – GMX

+0

@GMX、それは良い質問です。私はそれが文脈に依存すると思います。これがあまり頻繁に呼び出されない場合は、 '" index = "+ i'を使用する方が' StringBuilder'を使うよりもはるかに読みやすくなります。しかし、ループ内で1000回呼び出され、パフォーマンスが問題になる場合は、何らかの 'StringBuilder'オプションが有効でしょう。しかし、受け入れられた答えの要点は、文字列を作成するために複数行のコードが必要な場合は、確実に 'StringBuilder'を使用することでした。 – Suragch