14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaのStringについて

Last updated at Posted at 2016-11-17

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の結合

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メソッドを用いるのが良いでしょう。

参考文献

14
10
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?