CharをStringに変換する方法 Java (例)

⚡ スマートサマリー

文字を文字列に変換する Java String.valueOf(myChar) または Character.toString(myChar) を一度呼び出すだけで済みます。逆方向には charAt(index) を使用し、文字列からその位置で指定された文字を一つ取り出します。

  • 🔘 String.valueOf: String.valueOf(myChar) は 1 文字の文字列を返し、変換の意図を最も明確に示します。
  • ☑️ 文字.toString: Character.toString(myChar) も同じ仕事をします。 Java 9 は、String.valueOf に単純に委譲します。
  • charAt: charAt(index) は、0 から始まる位置にある文字を返し、有効範囲外の場合は StringIndexOutOfBoundsException をスローします。
  • 🧪 文字配列: toCharArray() は文字列を文字配列に分割し、new String(chars) はその配列からテキストを再構築します。
  • 🛠️ キャスティングなし: String型はオブジェクトであり、関連するプリミティブ型ではないため、String型をchar型にキャストすることはできません。
  • 📌 Unicodeの制限: char には 1 つの 16 ビット UTF-16 コード ユニットが格納されるため、絵文字には 2 つの char または Character.toString(codePoint) が必要です。

Java 文字を文字列に変換し、文字列を再び文字に変換するコード

このチュートリアルでは、値を2つの方法で移動させる2つの短いプログラムを学習します。 Java テキストを保存します:

  1. 文字を文字列に変換する
  2. 文字列を文字に変換する

この 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つの文字列を比較する, 書式設定された出力を印刷する.

よくあるご質問

char は、1 つの 16 ビット UTF-16 コード単位を単一引用符で囲んで保持するプリミティブ型です。String は、それらの単位のシーケンスを二重引用符で囲んで保持するオブジェクトであり、プリミティブ型にはない length() や charAt() などのメソッドを備えています。

いいえ。 Java 9. Character.toString(char) は String.valueOf(char) の呼び出しとして実装されているため、どちらも同じコードを実行します。作業環境で読みやすい方を選択してください。String.format(“%c”, c) だけが本当に遅い方法です。

char型は16ビットのコード単位を1つ格納し、絵文字はU+FFFFの上に位置します。 Java それらをサロゲートペアに分割し、2文字分を占有させます。codePointAt() でコードポイントを読み取り、Character.toChars() または Character.toString(codePoint) を使用してテキストを再構築します。

弦A。 Java 11 では、引数を Unicode コードポイントとして読み込む int オーバーロードが追加され、65 は A のコードポイントです。String.valueOf(65) は代わりに数字の 65 を返すため、2 つの呼び出しが混同されやすくなります。

プラス演算子で連結するか、ループ内で加算が行われるときにStringBuilderのappend()を呼び出します。 Java 文字列は不変であるため、連結を行うたびに、既存のオブジェクトを拡張するのではなく、新しいオブジェクトが割り当てられます。

それ以来 Java 9. コンパクト文字列では、内部の文字配列がバイト配列とコーダーフラグに置き換えられたため、純粋なラテン1テキストは文字ごとに1バイトを使用します。公開APIに変更はなく、charAt()は引き続き文字を返します。

機械学習型静的解析ツールは、コンパイラが受け入れる疑わしい変換(例えば、保護されていない charAt() 呼び出しや、char 配列のオーバーロードに解決される String.valueOf(null) など)を検出します。そして、検出結果を可能性に基づいてランク付けすることで、単純なルールベースのスキャンで発生するノイズを低減します。

GitHubコパイロット String.valueOf() と charAt() のワンライナーを確実に生成しますが、非推奨の new Character(c) コンストラクタなど、トレーニングデータから古いアドバイスも再現します。すべての提案をコンパイルし、非推奨の警告をお読みください。