プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Java
  • 【Java】+演算子、StringBuilder、StringBufferの違い(実際に測…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Java】+演算子、StringBuilder、StringBufferの違い(実際に測ってみた。)、文字列系の型

05.01

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

Javaの文字列連結には、下記のように色々な方法がありますよね。

  • Stringクラスの+演算子を使った方法
  • StringBufferを使った方法
  • StringBuilderを使った方法

実行速度について

一般的には、実行速度は下記と言われています。

StringBuilder > StringBuffer >>>>> +演算子

実際どうなのか?

それぞれ、10万回ループさせて、かかる時間を計測してみます。

+演算子

1
2
3
4
5
6
7
8
9
10
11
String plus = "";
 
long start = System.currentTimeMillis();
 
for(int i = 0 ;i < 100000;i++) {
plus = plus + "あ";
}
 
long end = System.currentTimeMillis();
 
System.out.println((end - start)  + "ms");

実行結果

StringBuilder

1
2
3
4
5
6
7
8
9
10
11
StringBuilder sb = new StringBuilder();
 
long start = System.currentTimeMillis();
 
for(int i = 0 ;i < 100000;i++) {
sb = sb.append("あ");
}
 
long end = System.currentTimeMillis();
 
System.out.println((end - start)  + "ms");

実行結果

StringBuffer

1
2
3
4
5
6
7
8
9
10
11
StringBuffer sb = new StringBuffer();
 
long start = System.currentTimeMillis();
 
for(int i = 0 ;i < 100000;i++) {
sb = sb.append("あ");
}
 
long end = System.currentTimeMillis();
 
System.out.println((end - start)  + "ms");

実行結果

一般的には、「StringBuilder > StringBuffer >>>>> プラス演算子」と言われていますが、「StringBuffer > StringBuilder >>>>> プラス演算子」になりましたね。

試した順番にもよるのかもしれませんね。

StringBuilder

1
2
3
4
5
StringBuilder sb = new StringBuilder();
sb.append("あ");
sb.append("い");
sb.append("う");
System.out.println(sb.toString());

インスタンスの内部に連結した文字列を蓄えるメモリ領域を保持しています。

一番速度が速いので、たいていの場合はこれを使いましょう!

メリット

可変な設計なので、文字列をappendメソッドで追加する度に、newすることなく、メモリに新たに追加していくので非常に高速。

デメリット

基本的には、速度の早い「StringBuilderクラス」を使えばいいのですが欠点もあります。

スレッド処理(複数の処理を同時に行うためのJavaの仕組み)の場合に、不具合が発生する場合があります。

その場合は、代わりに「StringBufferクラス」を使用しましょう。

Stringbuffer

1
2
3
4
5
StringBuffer sb = new StringBuffer();
sb.append("あ");
sb.append("い");
sb.append("う");
System.out.println(sb.toString());

StringBuilderクラスに比べると若干遅いですが、それでも「+演算子」に比べると非常に早いです。

+演算子

1
2
String plus = "あ" + "い" + "う";
System.out.println(plus);

+でStringを連結するたびに、古いインスタンスは捨てられて、新しいインスタンスがnewにより生成されています。

newによるインスタンスの生成は、JVMに非常に負荷をかけるので、StringBuilderや、StringBufferに比べると遅くなります。

メリット

  • Stringクラスなので、いちいちソースコードの中にnewを書く必要がなくスッキリする。
  • メソッドを使わず、ソースコードが直感的に理解できる。

まとめ

数個程度の文字列連結であれば、ソースコードの記述量が少ない「+演算子」を使いましょう。

ただ、例えば、CSVファイルを作る等の大量の文字列連結処理が発生する処理等は、「StringBuilder」もしくは、「StringBuffer」を使うようにしましょう!

文字列の型

Javaで、文字列を扱う場合は、Stringクラスを使用すると思います。

ただ、他にも下記のような扱い方をします。

char配列

Stringに含まれる文字をchar配列に格納します。

構文

Stringを、char配列に変換する場合は、Stringクラスの「toCharArrayメソッド」を使います。

用途

1文字ずつ、ループを回して、処理をしたい場合に使う。

サンプル

1
2
3
4
5
6
String str = "あいうえお";
char[] chrData = str.toCharArray();
 
for(int i=0;i<chrData.length;i++) {
System.out.println(chrData[i]);
}

標準出力に、一文字ずつ文字を出力するサンプルです。

実行結果

byte配列

文字列の情報をバイト列に変換して、1バイトごとに配列に格納した状態にします。

構文

Stringを、byte配列に変換する場合は、Stringクラスの「getBytesメソッド」を使います。

用途

指定した文字コードでファイルに保存したりする場合に使用したりします。

サンプル

1
2
3
4
5
6
7
8
9
10
11
String str = "あいうえお";
try {
byte[] byteData = str.getBytes("UTF-8");
 
for(int i=0;i<byteData.length;i++) {
System.out.println(byteData[i]);
}
 
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

実行結果

スポンサーリンク
  • 2018 05.01
  • miyabisan2
  • コメントを書く
  • Java
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 06.19

    【Java】例外処理の基本と、「独自例外」を作成するかのポイント

  2. 2018 04.14

    【Tomcat、サーブレット開発】web.xmlの書き方

  3. 2018 05.05

    【Java】テキストファイルの読み書き(サンプルあり)

  4. 2018 05.04

    【Java】オブジェクト指向:継承の問題点を解決する「抽象クラス」、「インターフェース」

  5. 2018 04.15

    【サーブレット】サーブレット、CGI、PHPの比較、サーブレットの動作の仕組み、注意点

  6. 2018 05.05

    【Maven】セントラルリポジトリについて

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Oracleアーキテクチャ】「共有プール」の構造や仕…

【Java】ジェネリクス(<>)って何?使うメリット等…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー