2006/10/23

[Java]String Concatnate

文字列結合の話。
Stringを結合するときには、この順に適用可能か考えていく。

  1. 演算子+を使う
  2. String#concat()
  3. StringBuffer

システム開発をやっていると文字列の取り扱いはいたる所で出てくる。当然結合処理も。数字だろうが日付だろうがStringなシステム(こういうところはDBのカラムも片っ端からCHARVARCHAR2になっている)もあるけど、それはちょっと別の話。

Stringの結合で+を使った結合は遅いという言葉をたまに聞くが、文面どおりにとってはいけない。完全に間違っているわけではないけど、略しすぎている。本当の内容は複数ステートメントにまたがる結合を行うなら、+を使った結合は遅くなるだ。

StringBufferStringクラスのAPI Documentに従うと、+結合はStringBuffer(Java5.0以降なら、場合によってStringBuilder)を使った結合に変換される。
コード str = stringA + stringB; 変換後 str = new StringBuffer().append(stringA).append(stringB).toString(); 当然、コンパイル後には2つに違いはない。これが複数ステートメントに分かれているとどうなるかというと、
コード str = stringA + stringB; str = str + stringC; str = new StringBuffer().append(stringA).append(stringB).toString(); str = new StringBuffer().append(str).append(stringC).toString(); となり、StringBufferの生成とStringへの変換が2回に分かれてしまう。こうなると、最初からStringBufferを生成しておいてappendしていく方が効率がいい。 for (int i = 0; i < strs.length; i++) {     str = str + strs[i]; ) なんかになるとnew StringBuffertoStringを配列の長さ分だけ実行することになってぼろぼろになる。これを+を使った結合は遅いといっているわけだ。

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム