Java : 文字列(String)の基本

文字列の作成、連結、置換、削除などなど。
コード例つきで文字列の基本をご紹介します。


文字列の作成

基本

文字列は ダブルクォーテーション ( " ) で囲って作成します。

"This is a string"

代入する変数の型は String になります。

String s = "This is a string";

日本語もOKです。

String s = "これは文字列です";

標準出力へ表示するには System.out.println を使います。

String s = "This is a string";
System.out.println(s); // This is a string

特殊な文字について(エスケープシーケンス)

文字列の作成には ダブルクォーテーション ( " ) を使いました。
それでは ダブルクォーテーション ( " ) 自体を表示させたい場合はどうすればよいか…
そんなときに使うのがエスケープシーケンスです。

String s = "ab\"cd";
System.out.println(s); // ab"cd

ダブルクォーテーション ( " ) の前に バックスラッシュ を置きます。
バックラッシュ ( ) は、環境によっては円記号 (¥) で表示される場合もあります。

このバックスラッシュと、その1つ後ろの文字を合わせてエスケープシーケンスといいます。
\" という一組で、ダブルクォーテーション文字そのものを表します。

以下は、主要なエスケープシーケンスとなります。

エスケープシーケンス 説明
\b バックスペース
\s スペース
\t タブ
\n 改行(LF)
\r 行頭復帰(CR)
\" ダブルクォーテーション文字自体を表します
\' シングルクォーテーション文字自体を表します
\\ バックスラッシュ文字自体を表します
// 改行の例
String s = "abcd\nあいうえ";

// abcd
// あいうえ
System.out.println(s);

関連記事:エスケープシーケンスの基本

テキストブロック(Java 15以降)

複数行の文字列を作成したい場合はテキストブロックを使うのが便利です。
""" (ダブルクォーテーションx3) + 改行""" で囲みます。

String s = """
        AAA
        BBB
        ZZZ
        """;

//AAA
//BBB
//ZZZ
System.out.println(s);

これは、改行をエスケープシーケンスで表記した以下の文字列と同等です。

String s = "AAA\nBBB\nZZZ\n";

//AAA
//BBB
//ZZZ
System.out.println(s);

関連記事:テキストブロックの基本

文字列の長さ

文字列の長さを取得するには length() を使います。

int len = "".length();
System.out.println(len); // 0
int len = "abcd".length();
System.out.println(len); // 4
int len = "あいうえお".length();
System.out.println(len); // 5

文字列の連結

+ 記号で文字列を連結できます。

String s1 = "abcd";
String s2 = "XYZ";
String s3 = s1 + s2;

System.out.println(s3); // abcdXYZ

+ 記号では、数値も連結できます。

String s = "abcd" + 123 + "XYZ";

System.out.println(s); // abcd123XYZ

補足

  • もし連結が何回も必要でパフォーマンスが落ちてしまう場合は、StringBuilder を使うことも検討してみましょう。

1文字の取り出し

文字列から指定の位置の文字を取り出すには charAt(int index) メソッドを使います。
indexは配列と同じように0から始まります。

String s = "abあいう";

char c0 = s.charAt(0);
System.out.println(c0); // a

char c1 = s.charAt(1);
System.out.println(c1); // b

char c2 = s.charAt(2);
System.out.println(c2); // あ

char c3 = s.charAt(3);
System.out.println(c3); // い

char c4 = s.charAt(4);
System.out.println(c4); // う

// 範囲外は例外が発生します。
s.charAt(5); // StringIndexOutOfBoundsException: index 5, length 5

補足

  • 後述するサロゲート文字を考慮する場合は注意が必要です。
    charAt の代わりに codePointAt を使うなど、API仕様をよくご確認ください。

部分文字列の取り出し

文字列から指定した範囲の文字列を取り出すには substring(int beginIndex, int endIndex) メソッドを使います。

beginIndex~(endIndex-1)の範囲の文字列を取得します。

String s = "abcde";

System.out.println(s.substring(0, 1)); // a
System.out.println(s.substring(0, 2)); // ab
System.out.println(s.substring(0, 3)); // abc
System.out.println(s.substring(0, 4)); // abcd
System.out.println(s.substring(0, 5)); // abcde
String s = "あいうえお";

System.out.println(s.substring(1, 4)); // いうえ
System.out.println(s.substring(2, 4)); // うえ
System.out.println(s.substring(3, 4)); // え

endIndexを省略すると、beginIndexから末尾までを取得します。

String s = "Java!";

System.out.println(s.substring(1)); // ava!
System.out.println(s.substring(2)); // va!
System.out.println(s.substring(3)); // a!
System.out.println(s.substring(4)); // !

文字列の置換・削除

文字列の置換には replace(CharSequence target, CharSequence replacement) メソッドを使います。

targetには置換元の文字列、replacementには置換後の文字列を指定します。

String s = "さくら".replace("さ", "い");
System.out.println(s); // いくら
String s = "aaabbbccc".replace("b", "B");
System.out.println(s); // aaaBBBccc

replacementに空文字を指定すると、targetを削除することになります。

String s = "ababab".replace("b", "");
System.out.println(s); // aaa

正規表現で置換したい場合は replaceAll(String regex, String replacement) を使います。

String s = "aaabbbccc";
System.out.println(s.replaceAll(".", "z")); // zzzzzzzzz
System.out.println(s.replaceAll("(a|b)", "x")); // xxxxxxccc

関連記事:正規表現の基本

数値との変換

文字列から数値に変換するには Integer.parseInt(String s) を使います。

int num = Integer.parseInt("1234");
System.out.println(num); // 1234

数値から文字列へ変換するには、String.valueOf(int i) や Integer.toString(int i) を使います。

String s = String.valueOf(1234);
System.out.println(s); // 1234
String s = Integer.toString(-4567);
System.out.println(s); // 1234

関連記事: 文字列と数値の変換

注意事項

サロゲート文字

文字列を構成する文字は、基本的には char 型で表現できます。

final char c1 = 'a';
final char c2 = 'あ';

char のサイズは 2バイトです。
しかし、そのサイズにおさまらない文字が存在します。

例えば、"𩸽" という文字です。

final var surrogate = "\uD867\uDE3D";  // "𩸽"という1文字
System.out.println(surrogate); // "𩸽"
System.out.println(surrogate.length()); // 2

final var chars = surrogate.chars().toArray();
System.out.println(Arrays.toString(chars)); // [55399, 56893]

文字自体は1文字ですが、lengthchars では 2文字として結果が返ります。
このような問題があるため、Javaでは int 型を使ったコードポイントが追加されました。

int は 4バイトあるので、すべての文字がおさまります。

final var surrogate = "\uD867\uDE3D";
System.out.println(surrogate); // "𩸽"

final var codePoints = surrogate.codePoints().toArray();
System.out.println(Arrays.toString(codePoints)); // [171581]

Stringクラスにも、上記の codePoints のように、文字を int で扱う API がいろいろと追加されています。
基本的には char のAPIは使わずに、int のコードポイント API を使うことをおすすめします。


関連記事

ページの先頭へ