忍者ブログ

ビーキョウのIT

このブログは99%ののほほんと1%のお菓子でできています。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


Javaプログラミング-効率的な文字列結合

こんちゃ(´・ω・)ノ


今回は、String型の文字列結合について書きます。

通常、文字列と文字列を結合するときはどのようにしていますか。
---------------------------------------
String s1="おうどん";
String s2="食べたい";

s1+=s2;
---------------------------------------
こんな感じでしょうか。
これでも普通に文字列連結はできますが、
これは少し無駄な処理があります。
「s1+=s2;」は書き直すと、
「s1=new StringBuffer().append(s1).append(s2).toString();」
といった感じになっています。
これはString型が固定長文字列しか扱えないため、
可変長文字列を扱えるStringBufferに追加してからString型に戻しているのです。


これは効率的とは言えません。

このような文字列結合をループ文で回すときにパフォーマンスに違いがでます。
--------------------------------------
String s="最初";
for(int i=0 ; i<100 ; i++){
     s+="追加するよ";
}
-------------------------------------
このループは一見普通に見えますが、
中では「new StringBuffer()」を100回行っていることになります。
オブジェクト生成を100回もやったら、パフォーマンスが落ちるのも当然でしょう。

これを解決する方法としては、
最初から可変長文字列が扱える型に変換して追加していけばいいだけです。
先ほどのループ文を修正します。
--------------------------------------
String s="最初";
  StringBuffer sb = new StringBuffer(s);

  for(int i=0 ; i<100 ; i++){
    sb.append("追加するよ");
  }
  s=sb.toString();
-------------------------------------

となります。
上記の文字列結合だとStringBuffer は一回しか生成されていないので、効率的です。

◆おまけ
今回は可変長の文字列としてStringBufferを使用しましたが、
StringBuilderというクラスもある。
StringBuilderもか可変長文字列を扱え、ほとんどStringBufferと同じだが、
StringBufferはマルチスレッド対応型なのに対し、
StringBuilderはシングルスレッドしか考慮していない。

スレッドを考慮しない際に、StringBuilderはStringBufferより速かったりする。
この辺も使い分けれると素敵。


 

拍手[1回]

PR

COMMENT

Name
Title
Mail
URL
Color
Emoji Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Comment
Pass   コメント編集用パスワード
 管理人のみ閲覧

TRACKBACK

Trackback URL:

カレンダー

03 2018/04 05
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

最新コメント

[11/13 NEX-C3]
[01/24 R]
[07/30 ビーキョウ]
[07/25 unknown]
[06/24 ブログランキング]

最新トラックバック

バーコード

広告

カウンター

ブログ内検索

プロフィール


HN:ビーキョウ
職業:SI屋(PG、SE)
<自己紹介>
ちゃお(´・ω・)ノ
ビーキョウです。
どんどんスキルアップして、 その中で学んだことを忘れないようにメモ代わり的な 感じで記事を書いていこうという考えです。

なので、適当な部分が多々あるとは思いますが、 なにとぞよろしくお願いします
(´ ▽`)

バナーエリア

Copyright ©  -- ビーキョウのIT --  All Rights Reserved
Designed by CriCri / Photo by Geralt / Powered by [PR]
/ 忍者ブログ