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
関連記事: 文字列と数値の変換
注意事項
サロゲート文字
サロゲート文字とは、「1つの文字」を「2つの char値」で表現する文字です。
サロゲート・ペアともいいます。
ちょっと難しい内容になりますが、変なところでハマる可能性があるので、少しだけ解説します。
文字列を構成する 文字 は、基本的には char 型で表現できます。
final char c1 = 'a';
final char c2 = 'あ';
char のサイズは 2バイトです。
2バイトでは、単純に計算すると 65536 種類の文字を扱うことができます。
Java が公開された当初はそれでも問題ありませんでした。
しかし、文字の種類は増え続け、今では 65536 種類を超えてしまっています。
例えば、"😊" という顔文字を見てみましょう。
これは文字としては 1文字 ですね。
final var surrogate = "😊";
System.out.println(surrogate); // "😊"
System.out.println(surrogate.length()); // 2
しかし、文字列の長さを取得する length メソッドは 2 を返しました。
本来は 1 を返して欲しいところですが…
実際に、どのような char 値が入っているかは chars メソッドで確認できます。
final var surrogate = "😊";
final var chars = surrogate.chars().toArray();
System.out.println(Arrays.toString(chars)); // [55357, 56842]
chars メソッドは ストリーム を返すので toArray で配列に変換しています。
結果は、[55357, 56842] となりました。
"😊" という文字は、char 値としては 55357 と 56842 の2文字としてカウントされているわけですね。
このような問題があるため、Java では int 型を使った コードポイント が追加されました。
int は 4バイトあるので、char より多くの文字を扱えます。
final var surrogate = "😊";
System.out.println(surrogate); // "😊"
final var codePoints = surrogate.codePoints().toArray();
System.out.println(Arrays.toString(codePoints)); // [128522]
codePoints メソッドは、先ほどの chars メソッドと違い、コードポイントとして文字を返します。
"😊" という文字は コードポイント値としては 128522 の1文字としてカウントされています。
他にも、Stringクラスには、文字をコードポイントで扱うメソッドがいろいろと追加されています。
基本的には char 型を扱うメソッドは使わずに、int 型のコードポイントを扱うメソッドを使うことをおすすめします。
まとめ
本記事では、文字列の基本的な使い方についてご紹介しました。
プログラミングでは、文字列は必須といってよいくらいにとてもよく使います。
ぜひ、有効に活用していきたいですね。
さらに細かい文字列操作については「String (文字列) - API使用例」も合わせてご確認ください。