10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

JavaのStringについて

JavaのStringについてまとめます。

Stringとは

文字列を扱うクラスです。結合を加算と同様の感覚で行えるため、C言語から移った人だと感動するかもしれません。

Test.java
public class Test {
    public static void main(String[] args) {
        String a = "aaa";
        a += "bbb";
        a += "ccc";
        System.out.println(a);
    }
}

Stringは不変オブジェクト

見た目上は結合を加算と同様に行えるStringですが、実は裏ではオブジェクトを作り直すという処理を行っています。これはStringが内容を変更できない不変オブジェクト (イミュータブルなオブジェクト) の一種だからです。先ほどの例だと、次のような処理を行っていることになります。

Test.java
public class Test {
    public static void main(String[] args) {
        String a = "aaa";
        a += "bbb"; // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
        a += "ccc"; // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
        System.out.println(a);
    }
}

Stringのコピー

Javaには浅いコピーと深いコピーという概念がありますが(詳細はJavaのcloneメソッドの正しい実装方法 - Qiitaを参照)、Stringは浅いコピーで十分だったりします。というのも、Stringは不変オブジェクトなので、同じオブジェクトを参照していても、内容を書き換えてしまう心配がないのです。

Stringの結合

StringBuilder

StringBuilder

StringBuilderは、appendメソッドによって内部のchar配列に文字列を貯めていき、それらを結合させたStringをtoStringメソッドによって生成する、という形でStringを結合させるオブジェクトになります。
先ほど、Stringを結合させる際に裏ではStringを作り直している、と書きましたが、実はこのStringBuilderを用いて連結させているのです。例えば、先ほどのコードは実際には次のような処理を行っています。

Test.java
public class Test {
    public static void main(String[] args) {
        String a = "aaa";
        a = (new StringBuilder(String.valueOf(a))).append("bbb").toString(); // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
        a = (new StringBuilder(String.valueOf(a))).append("ccc").toString(); // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
        System.out.println(a);
    }
}

このコードを見るとわかるように、結合させる度にStringBuilderが生成されています。しかし、貯めてから結合させるという使い方をするということを考えると、以下のような形にした方が効率が良いことがわかります。

Test.java
public class Test {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("aaa");
        sb.append("bbb");
        sb.append("ccc");
        String a = sb.toString();
        System.out.println(a);
    }
}

StringBuffer

StringBuilderのスレッドセーフ版がStringBufferとなります。使い方はStringBuilderと同じです。

Test.java
public class Test {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("aaa");
        sb.append("bbb");
        sb.append("ccc");
        String a = sb.toString();
        System.out.println(a);
    }
}

concatメソッド

Stringには2つのStringを結合させるconcatメソッドというものがあり、次のように用います。

Test.java
public class Test {
    public static void main(String[] args) {
        String a = "aaa";
        a = a.concat("bbb"); // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
        a = a.concat("ccc"); // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
        System.out.println(a);
    }
}

内部では2つの文字列を結合したStringを生成するという処理を行っています。

使い分け

多くの文字列を結合させるのであればStringBuilder (StringBuffer) を、一度文字列を結合させるだけであればconcatメソッドを用いるのが良いでしょう。

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
10
Help us understand the problem. What are the problem?