文字列.toCharArray() / String.copyValueOf()
| 対応: | Java 1.0(1996) |
|---|
文字列を文字の配列(char[])に変換したり、文字配列から文字列を生成したりするメソッドです。文字列を1文字ずつ操作したい場合や、ストリームAPIと組み合わせる際に活用されます。
構文
// 文字列を char 配列に変換する 文字列.toCharArray(); // char 配列から文字列を生成する String.copyValueOf(char[] data); String.copyValueOf(char[] data, int offset, int count); // 文字列の各文字のコードポイントをIntStreamで返す(Java 8 以降) 文字列.chars();
メソッド一覧
| メソッド | 概要 |
|---|---|
| toCharArray() | 文字列の各文字を要素とする新しい char[] を返します。 |
| String.copyValueOf(char[] data) | 文字配列全体から文字列を生成して返します。new String(char[]) と同等の結果を返します。 |
| String.copyValueOf(char[] data, int offset, int count) | 文字配列の offset から count 文字分の文字列を生成して返します。 |
| chars() | 文字列の各文字を int(コードポイント)として扱う IntStream を返します。Java 8 以降で使用できます。 |
サンプルコード
StringTochararray.java
class StringTochararray {
public static void main(String[] args) {
// toCharArray() で文字配列に変換する
String str = "Hello";
char[] chars = str.toCharArray();
for (char c : chars) {
System.out.print(c + " "); // 『H e l l o 』と出力されます
}
System.out.println();
// 文字配列を操作してから文字列に戻す
char[] arr = "kiryu".toCharArray();
arr[0] = 'K'; // 先頭を大文字に変更する
String modified = new String(arr);
System.out.println(modified); // 『Kiryu』と出力されます
// String.copyValueOf() で char 配列から文字列を生成する
char[] data = {'J', 'a', 'v', 'a'};
String result = String.copyValueOf(data);
System.out.println(result); // 『Java』と出力されます
// offset と count を指定して一部を取り出す
String partial = String.copyValueOf(data, 0, 2);
System.out.println(partial); // 『Ja』と出力されます
// chars() をストリームAPIで活用する
long count = "Hello World".chars()
.filter(c -> c == 'l')
.count();
System.out.println(count); // 『3』と出力されます
}
}
コンパイルして実行すると次のようになります。
javac StringTochararray.java java StringTochararray H e l l o Kiryu Java Ja 3
概要
『toCharArray()』は文字列を char の配列に変換します。返された配列はコピーなので、要素を変更しても元の文字列には影響しません(Javaの文字列は不変)。文字を1文字ずつ処理するループを書く場合に便利です。
Java 8以降では『chars()』でストリームAPIを使ったより宣言的な記述が可能です。ただし『chars()』が返すのは char 型ではなく int 型のストリーム(IntStream)なので、文字として扱うには明示的に (char) にキャストする必要があります。
文字列の長さや指定位置の文字取得には『length() / charAt()』、文字列の切り出しには『substring()』を使用することができます。
よくあるミス
toCharArray() の結果を変えても元の文字列は変わらない
toCharArray() は文字列のコピーを返します。配列を変更しても元の String には影響しません。変更後の文字列が必要なら new String(chars) で再構築します。
String original = "kiryu"; char[] chars = original.toCharArray(); chars[0] = 'K'; System.out.println(original); // 『kiryu』と出力されます。(元は変わらない) System.out.println(new String(chars)); // 『Kiryu』と出力されます
chars() のストリームは int 型
chars() は IntStream を返します。文字として処理するには (char) にキャストする必要があります。キャストしないと数値として扱われます。
String name = "桐生"; name.chars().forEach(c -> System.out.print(c + " ")); // 『26792 29983 』と出力されます System.out.println();
修正後は次の通りです。
String name = "桐生"; name.chars().forEach(c -> System.out.print((char) c + " ")); // 『桐 生 』と出力されます System.out.println();
サロゲートペアを含む文字列で toCharArray() を使う
絵文字などのサロゲートペア文字は2つの char で表現されます。toCharArray() で得た配列をそのまま1文字ずつ処理すると、壊れた文字が出力される場合があります。
String emoji = "😊AB"; char[] chars = emoji.toCharArray(); System.out.println(chars.length); // 『4』と出力されます。(😊は2要素) // コードポイント単位で処理する場合は codePoints() を使う emoji.codePoints().forEach(cp -> System.out.print(new String(Character.toChars(cp)) + " ")); // 『😊 A B 』と出力されます
コンパイルして実行すると次のようになります。
javac StringTochararray.java java StringTochararray kiryu Kiryu 26792 29983 桐 生 4 😊 A B
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。