2017年3月6日月曜日

Java学習と文字列連結

先日、Java学習のためにこんな本を買った。Amazonポイントのための奨学金の無駄遣いではない

こんな本
スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)

買ってからしばらく置いていたが、やっと心の準備ができたので開いてみた。実践編というだけあって確かに初歩的なことは習得している前提のようで、1章までしか読んでいないが割りとサクサク進む。1章はStringクラスのメソッドを使った文字列操作を解説しているのだが、大学の授業とある程度かぶっているあたりに「うちの大学はちゃんとやっていたんだ」ということを実感した。

連結演算子の話


さておき、これを読んで初めて知ったがJavaにおける文字列演算子は「+」だけではないらしい。StringBuilderとStringBufferなる手法が存在し、それらは「+」演算子を用いた文字列連結より高速に動作するのだと。曰く、String型が確保するメモリ領域は不変型のため、連結するたびにnewでメモリを再確保している。一方でStringBuilderは可変型の領域を持つのでより高速になる。書籍ではどこかの携帯会社のようにグラフを使ってその高速性を表現しているが、百聞は一見にしかず。実際はどうなのか試してみることにした。

+演算子側


今回+演算子の面目を守るため実行するコードはこれ。

public class StringConsolidateByPlus {
    public static void main(String[] args) {
        String str = "";
        for(int i = 0; i < 100000; i++){
            str += "java"; 
        }
    }
}

10万回も実行するのは1回や100回では0秒で終わってしまうからである。これを実行した結果がこれ。

run:
ビルド成功(合計時間: 21秒)

今まで「Enter一つですぐ結果」なプログラムばかりを書いてきた身としてはあまりにも遅い。まさかここまでかかるとは思わなかった。

StringBuilder側


では、個人的期待の新人StringBuilderではどうか。StringBuilderはインスタンスを生成、それに追記して最後にtoStringすることでString型を得られる。実行するコードは以下。

public class StringConsolidatedByStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < 100000; i++){
            sb.append("java");
        }
        String str = sb.toString();     
        }
}

そして実行した結果がこれ。

run:
ビルド成功(合計時間: 0秒)

まさに瞬殺。まだ「Enter一つですぐ結果」の世界はあったんだ…!

StringBuilder最高


文字列連結演算子の時代は終わった。これからは彼には加算演算子としてのみ活躍していただこう。もっと早く知りたかったよ…もっともこの速度が必要になるほどのプログラムはもう少し先になりそうだけども。

0 件のコメント:

コメントを投稿