CharをStringに変換する方法 Java (例)
⚡ スマートサマリー
文字を文字列に変換する Java String.valueOf(myChar) または Character.toString(myChar) を一度呼び出すだけで済みます。逆方向には charAt(index) を使用し、文字列からその位置で指定された文字を一つ取り出します。
このチュートリアルでは、値を2つの方法で移動させる2つの短いプログラムを学習します。 Java テキストを保存します:
- 文字を文字列に変換する
- 文字列を文字に変換する
この 2 つの型は互換性がありません。char は、1 つの 16 ビット UTF-16 コード ユニットを正確に 1 つ保持するプリミティブで、シングル クォーテーションで囲んで 'g' と表記されます。String は、それらのコード ユニットのシーケンスを保持するオブジェクトで、ダブル クォーテーションで囲んで ' と表記されます。Guru99」。一方はプリミティブ型で他方はオブジェクト型なので、キャストでは橋渡しできません。ライブラリメソッドがその処理を行う必要があります。 Java 各方向に1つずつ供給します。
文字を文字列に変換
文字を文字列に変換する方法は複数あります Java。 内部的に a Java 文字列にはテキストが格納されます コードユニットの配列として扱われるため、単一の文字が簡単に配列に収まります。文字は16ビットの符号なしデータ型で、幅は2バイト、0から65,535までの値を保持します。
文字を文字列に変換するには、Character クラスの静的メソッド toString() と String クラスの静的メソッド valueOf() の 2 つの方法があります。どちらも 1 文字の新しい文字列を返し、以下の 2 つのプログラムは同じ結果を出力します。
方法 1: toString() メソッドを使用する
以下のプログラムは文字 g を 文字変数 そして、その文字を Character.toString() に渡すと、その文字が文字列として返されます。コードは編集可能なので、文字を変更して再度実行し、出力の変化を確認してください。
public class CharToString_toString {
public static void main(String[] args) {
//input character variable
char myChar = 'g';
//Using toString() method
//toString method take character parameter and convert string.
String myStr = Character.toString(myChar);
//print string value
System.out.println("String is: " + myStr);
}
}
期待される出力:
String is: g
方法 2: valueOf() メソッドを使用する
2番目のプログラムはString.valueOf(myChar)を入れ替えるだけで、それ以外は何も変更しません。 Java 9 2 つの呼び出しは同じ操作です。Character.toString(char) は String.valueOf(char) の呼び出しとして実装されているため、どちらも他方より明らかに高速ではありません。
public class CharToString_valueOf {
public static void main(String[] args) {
char myChar = 'g';
//valueOf method take character parameter and convert string.
String myStr = String.valueOf(myChar);
////print string value
System.out.println("String is: " + myStr);
}
}
期待される出力:
String is: g
文字を文字列に変換するその他の方法
古いコードや面接の質問には、さらに4つの方法が登場します。これらはすべて機能しますが、上記の2つの方法ほど分かりやすくはなく、そのうち2つは必要以上にメモリを割り当てています。
public class CharToStringMore { public static void main(String[] args) { char myChar = 'g'; // 1. concatenation with an empty literal String byConcat = myChar + ""; // 2. the Character wrapper instance method String byWrapper = Character.valueOf(myChar).toString(); // 3. a one-element array of code units String byArray = new String(new char[]{myChar}); // 4. the format() helper with the %c conversion String byFormat = String.format("%c", myChar); System.out.println(byConcat + byWrapper + byArray + byFormat); } }
期待される出力:
gggg
この表は、各ルートがどのような場合に利用する価値があるかを示しています。
| 方法 | 例: | Notes |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | 推奨。呼び出しは1回のみで、返される文字列以外に余分なオブジェクトは生成されません。 |
| 文字.toString(char) | Character.toString(myChar) | 同じくらい良い。 Java 1.4以降はString.valueOfに委譲されます。 Java 9. |
| 連結 | myChar + “” | 作品、そして Java バージョン9以降ではStringBuilderではなくinvokedynamic呼び出しにコンパイルされるため、以前の「処理が遅い」という警告はもはや当てはまりません。ただし、意図は依然として隠蔽されます。 |
| 文字ラッパー | Character.valueOf(myChar).toString() | Boxまず、char を取得します。非推奨となり削除予定の new Character(char) コンストラクタではなく、Character.valueOf を使用してください。 Java 9. |
| 文字配列 | new String(new char[]{myChar}) | 配列を割り当ててコピーします。既に文字配列を保持している場合に備えて予約しておいてください。 |
| 文字列.format | String.format(“%c”, myChar) | フォーマット文字列が実行時に解析されるため、処理速度は圧倒的に遅い。文字がより大きなテンプレートの一部である場合にのみ有効。 |
1文字変換の双方向処理が終わったので、次は逆方向の処理です。
文字列を文字に変換
String クラスの charAt() メソッドを使用して、String を char に変換できます。このメソッドはゼロベースのインデックスを受け取り、その位置にある char を返します。つまり、すべての文字を読み取ると、 トイレping 0からlength()マイナス1までの範囲です。0未満またはlength()以上を指定すると、StringIndexOutOfBoundsExceptionが発生します。
以下のプログラムはストリングを走査します Guru99 一度に 1 つの位置ずつ処理し、各文字をそのインデックスとともに出力します。
//Convert String to Character using string method
package com.guru99;
public class StringToChar {
public static void main(String[] args)
{
//input String
String myStr = "Guru99";
//find string length using length method.
int stringLength =myStr.length();
//for loop start 0 to total length
for(int i=0; i < stringLength;i++)
{
//chatAt method find Position and convert to character.
char myChar = myStr.charAt(i);
//print string to character
System.out.println("Character at "+i+" Position: "+myChar);
}
}
}
期待される出力:
Character at 0 Position: G Character at 1 Position: u Character at 2 Position: r Character at 3 Position: u Character at 4 Position: 9 Character at 5 Position: 9
String は単純にキャストすることはできません。`char c = (char) myStr;` はコンパイルエラーになります。これは、String がオブジェクトであり、char がプリミティブ型であるためです。すでに 1 文字しか格納されていないことがわかっている String の場合、`charAt(0)` だけで十分です。
文字列を文字配列に変換し、また元に戻す
一度にすべての文字が必要な場合、toCharArray() は、インデックスごとにではなく、すべての文字を一度に取得します。 新しい文字配列その配列をテキストに戻すのは、String(char[]) コンストラクタまたは String.valueOf(char[]) の役割であり、どちらも配列を防御的にコピーするため、後で配列を編集しても String は変更されません。
public class StringCharArray { public static void main(String[] args) { String myStr = "Guru99"; // the text split into its array of code units char[] chars = myStr.toCharArray(); System.out.println(chars.length); System.out.println(chars[0]); // the array turned back into text System.out.println(new String(chars)); System.out.println(String.valueOf(chars)); // one range copied into an array you already own char[] part = new char[4]; myStr.getChars(0, 4, part, 0); System.out.println(new String(part)); } }
期待される出力:
6 G Guru99 Guru99 Guru
4番目のメソッドであるgetChars(srcBegin, srcEnd, dst, dstBegin)は、新しい配列を割り当てる代わりに、既に所有している配列に範囲をコピーします。終了インデックスは排他的であるため、getChars(0, 4, part, 0)は Guru ではなく Guru9. 範囲外の境界値を取得すると、IndexOutOfBoundsException がスローされます。
これら3つのアプローチの主な違いは、配分する内容にある。以下にその概要を示す。
| 仕事 | コール | 割り当てるもの |
|---|---|---|
| 文字列を文字配列に変換する | myStr.toCharArray() | 新しい配列。空の文字列に対しても安全で、長さゼロの配列を返します。 |
| 文字配列を文字列に変換 | new String(chars) または String.valueOf(chars) | 新しい文字列と、配列の内部コピー。 |
| 既存の配列に範囲を追加する | myStr.getChars(0, 4, part, 0) | 特に目新しいことはなく、指定された配列に書き込みます。 |
char と String を変換する際のよくあるエラー Java
これらの変換における問題のほとんどは、変換方法そのものよりも、繰り返し発生する6つの間違いに起因しています。以下の表は、それぞれの間違いと修正方法をまとめたものです。
| 問題 | 原因となる | 修正する |
|---|---|---|
| 互換性のない型: String を char に変換できません | char c = (char) myStr; のように型変換を試みる。 | 代わりに myStr.charAt(0) を呼び出してください。オブジェクトとプリミティブ型の間には型変換は存在しません。 |
| StringIndexOutOfBoundsException | charAt() を負のインデックスで呼び出した場合、または空の文字列に対して length() を呼び出した場合 | 読み取り前に isEmpty() でガードするか、インデックスを length() と比較してください。 |
| String.valueOf(null) は NullPointerException をスローします | 裸の null は char[] オーバーロードに一致し、これは最も具体的なものです | テキスト「null」をそのまま表示したい場合は、String.valueOf((Object) null) と記述してください。 |
| Character.toString(65)は65ではなくAを返します。 | Java バージョン11では、引数をUnicodeコードポイントとして読み込むCharacter.toString(int)オーバーロードが追加されました。 | 数字の65には、String.valueOf(65)またはInteger.toString(65)を使用してください。 |
| 絵文字が2つの判読不能な記号として印刷される | U+FFFF より上の文字は 2 文字を占め、高い代理文字の後に低い代理文字が続きます | codePointAt(0)で値を読み取り、次にCharacter.toString(codePoint)で再構築します。 Java 11以降。 |
| 新しい Character(myChar) に対する非推奨警告 | Character(char)コンストラクタは、 Java 9 除去対象としてマークされている | Character.valueOf(myChar) を使用するか、自動ボクシングにラッパーを提供させてください。 |
同じStringクラスは、多くの関連演習をサポートしています。 再帰による文字列の反転, 2つの文字列を比較する, 書式設定された出力を印刷する.
