Cum să convertiți Char în șir în Java (Exemple)

⚡ Rezumat inteligent

Conversia unui caracter într-un șir de caractere în Java primește un singur apel către String.valueOf(myChar) sau Character.toString(myChar). Deplasarea în direcția inversă utilizează charAt(index), care extrage un caracter dintr-un String în funcție de poziția sa.

  • 🔘 String.valueOf: String.valueOf(myChar) returnează un șir de caractere și prezintă intenția conversiei cât mai clar.
  • ☑️ Caracter.înșir: Character.toString(myChar) face aceeași treabă și, din moment ce Java 9, deleagă pur și simplu către String.valueOf.
  • caracterLa: charAt(index) returnează caracterul la o poziție cu bază zero și generează o excepție StringIndexOutOfBounds în afara intervalului valid.
  • 🧪 tablouri de caractere: toCharArray() împarte un String într-un array de caractere, iar new String(chars) reconstruiește textul din acel array.
  • 🛠️ Fără casting: Un String nu poate fi niciodată convertit la un char, deoarece un String este un obiect și nu un tip primitiv înrudit.
  • 📌 Limită Unicode: Un caracter conține o unitate de cod UTF-16 pe 16 biți, deci un emoji are nevoie de două caractere sau de Character.toString(codePoint).

Java cod care convertește un caracter într-un șir de caractere și un șir de caractere înapoi într-un caracter

În acest tutorial, vom studia două programe scurte care mută o valoare între cele două direcții Java stochează textul:

  1. Conversia unui caracter într-un șir de caractere
  2. Conversia unui șir de caractere într-un caracter

Cele două tipuri nu sunt interschimbabile. Un char este o primitivă care conține exact o unitate de cod UTF-16 pe 16 biți, scrisă între ghilimele simple ca „g”. Un String este un obiect care conține o secvență a acestor unități de cod, scrisă între ghilimele duble ca „Guru99”. Deoarece una este o primitivă, iar cealaltă un obiect, nicio conversie nu le poate lega — o metodă de bibliotecă trebuie să facă treaba și Java furnizează câte unul pentru fiecare direcție.

Convertiți Char în șir

Există mai multe modalități de a converti un caracter într-un șir de caractere în JavaIntern a Java Șirul își stochează textul ca o matrice de unități de cod, motiv pentru care un singur caracter se potrivește atât de ușor într-unul singur. Un caracter este un tip de date nesemnat pe 16 biți, cu lățimea de doi octeți, care conține valori de la 0 la 65,535.

Putem converti un caracter într-un șir de caractere folosind 2 metode — metoda statică toString() din clasa Character și metoda statică valueOf() din clasa String. Ambele returnează un șir nou-nouț, lung de un caracter, iar cele două programe de mai jos afișează același rezultat.

Metoda 1: Folosind metoda toString().

Programul de mai jos stochează litera g într-un variabila char și îl transmite către Character.toString(), care returnează acel caracter unic sub formă de șir de caractere. Codul este editabil, așa că schimbați litera și rulați-l din nou pentru a urmări rezultatul.

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);
  }
} 

Rezultat așteptat:

String is: g

Metoda 2: Folosind metoda valueOf().

Al doilea program introduce String.valueOf(myChar) și nu modifică nimic altceva. Deoarece Java În figura 9, cele două apeluri reprezintă aceeași operațiune: Character.toString(char) este implementată ca un apel către String.valueOf(char), deci niciuna nu este măsurabil mai rapidă decât cealaltă.

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);
  }
}

Rezultat așteptat:

String is: g

Alte metode de a converti un caracter într-un șir de caractere

Alte patru rute apar în codul mai vechi și în întrebările din interviuri. Toate funcționează, dar niciuna dintre ele nu se citește la fel de clar ca cele două metode de mai sus, iar două dintre ele alocă mai mult decât este necesar.

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);
  }
}

Ieșire preconizată:

gggg

Tabelul stabilește când merită utilizată fiecare rută.

Metodă Exemplu notițe
String.valueOf(char) String.valueOf(myChar) Recomandat. Un apel, fără obiect suplimentar dincolo de șirul returnat.
Caracter.înșir(char) Character.toString(myChar) La fel de bun. Disponibil de la Java 1.4 și deleagă către String.valueOf deoarece Java 9.
Concatenare myChar + „” Lucrează și mai departe Java 9 și versiunile ulterioare se compilează într-un apel invokedynamic în loc de un StringBuilder, așadar vechea avertizare că este lentă nu mai este valabilă. Încă ascunde intenția.
Înveliș de caractere Character.valueOf(myChar).toString() Boxfolosește mai întâi char. Folosește Character.valueOf, nu noul constructor Character(char), a cărui eliminare a fost depreciată de la Java 9.
matrice de caractere new String(new char[]{myChar}) Alocă un array și îl copiază. Îl rezervă pentru cazul în care dețineți deja un array de tip char.
String.format String.format(„%c”, myChar) De departe cel mai lent, deoarece șirul de format este analizat în timpul execuției. Util doar atunci când caracterul face parte dintr-un șablon mai mare.

Odată acoperite ambele direcții ale conversiei cu un singur caracter, urmează operația inversă.

Convertiți șirul în char

Putem converti un șir de caractere într-un caracter folosind metoda charAt() a clasei String. Metoda preia un index cu bază zero și returnează caracterul aflat în acea poziție, deci citirea fiecărui caracter înseamnă looping de la 0 până la length() minus unu. Solicitarea unui index sub 0 sau la length() și peste acesta generează o excepție StringIndexOutOfBoundsException.

Programul de mai jos parcurge șirul Guru99 câte o poziție pe rând și afișează fiecare caracter cu indicele său.

//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);
	      }
 
	}
 
}

Ieșire preconizată:

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

Rețineți că un String nu poate fi pur și simplu convertit: char c = (char) myStr; nu compilează, deoarece un String este un obiect, iar un char este o primitivă. Pentru un String despre care se știe deja că conține exact un caracter, charAt(0) este răspunsul complet.

Conversia unui șir de caractere într-un array de caractere și înapoi

Când este nevoie de fiecare caracter simultan, în loc de un index pe rând, toCharArray() returnează o matrice de caractere proaspătăRetransformarea acelui tablou în text este sarcina constructorului String(char[]) sau a lui String.valueOf(char[]), ambele copiind tabloul în mod defensiv, astfel încât modificările ulterioare ale tabloului să nu modifice String-ul.

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));
  }
}

Ieșire preconizată:

6
G
Guru99
Guru99
Guru

O a patra metodă, getChars(srcBegin, srcEnd, dst, dstBegin), copiază un interval într-un array pe care îl dețineți deja în loc să aloce unul nou. Indexul final este exclusiv, motiv pentru care getChars(0, 4, part, 0) produce Guru mai degrabă decât Guru9. Limitele în afara intervalului generează IndexOutOfBoundsException.

Cele trei abordări diferă în principal prin ceea ce alocă, așa cum este rezumat mai jos.

Sarcină Apel Ceea ce alocă
Șir de caractere către matrice de caractere myStr.toCharArray() Un nou tablou; sigur pe un șir gol, unde returnează un tablou de lungime zero.
matrice de caractere în șir de caractere new String(chars) sau String.valueOf(chars) Un nou șir de caractere plus o copie internă a matricei.
Interval într-o matrice existentă myStr.getChars(0, 4, part, 0) Nimic nou; scrie în matricea pe care o furnizați.

Erori frecvente la convertirea caracterelor și șirurilor de caractere în Java

Majoritatea problemelor din aceste conversii provin din șase greșeli recurente, mai degrabă decât din metodele în sine. Tabelul le asociază pe fiecare cu soluția corectă.

Problemă Provoca Repara
tipuri incompatibile: Șirul de caractere nu poate fi convertit în caractere O încercare de conversie, cum ar fi char c = (char) myStr; Apelați în schimb myStr.charAt(0). Nu există nicio conversie între un obiect și o primitivă.
Excepție StringIndexOutOfBounds charAt() apelat cu un index negativ sau cu length() pe un șir gol Protejați-vă cu isEmpty() sau comparați indexul cu length() înainte de citire.
String.valueOf(null) generează o excepție NullPointerException Valoarea nulă goală se potrivește cu supraîncărcarea char[], care este cea mai specifică. Scrieți String.valueOf((Object) null) când textul literal null este ceea ce doriți.
Character.toString(65) returnează A, nu 65 Java 11 a adăugat o supraîncărcare Character.toString(int) care citește argumentul său ca punct de cod Unicode Folosește String.valueOf(65) sau Integer.toString(65) pentru cifrele 65.
Un emoji se imprimă ca două simboluri denaturate Caracterele de mai sus decât U+FFFF ocupă două caractere, un surogat de nivel înalt urmat de un surogat de nivel scăzut. Citiți valoarea cu codePointAt(0), apoi reconstruiți-o cu Character.toString(codePoint) pe Java 11 și ulterior.
Avertisment de perimare pentru noul Character(myChar) Constructorul Character(char) este depreciat de la Java 9 și marcat pentru îndepărtare Folosește Character.valueOf(myChar) sau lasă autoboxing-ul să furnizeze wrapper-ul.

Aceeași clasă String suportă numeroase exerciții învecinate: inversarea unui șir de caractere cu recursiune, compararea a două șiruri de caractere și imprimarea ieșirii formatate.

Întrebări frecvente

Un caracter char este o primitivă care conține o unitate de cod UTF-16 pe 16 biți, scrisă între ghilimele simple. Un șir de caractere este un obiect care conține o secvență a acestor unități, scrisă între ghilimele duble, și care conține metode precum length() și charAt() pe care o primitivă nu le poate conține.

Nu. Din moment ce Java 9, Character.toString(char) este implementat ca un apel către String.valueOf(char), deci cele două rulează același cod. Alegeți-o pe cea care se citește mai bine acolo unde lucrați; String.format(„%c”, c) este singura rută cu adevărat lentă.

Un caracter stochează o unitate de cod pe 16 biți, iar emoji-ul se află deasupra lui U+FFFF. Java le împarte într-o pereche surogat, astfel încât să ocupe două caractere. Citește punctul de cod cu codePointAt() și reconstruiește textul cu Character.toChars() sau Character.toString(codePoint).

Șirul A. Java Versiunea 11 a adăugat o supraîncărcare int care își citește argumentul ca punct de cod Unicode, iar 65 este punctul de cod pentru A. String.valueOf(65) returnează în schimb cifrele 65, ceea ce face ca cele două apeluri să fie ușor de confundat.

Concatenați-l cu operatorul plus sau apelați append() pe un StringBuilder atunci când adunarea are loc în interiorul unei bucle. A Java Șirul de caractere este imuabil, deci fiecare concatenare alocă un obiect nou în loc să îl extindă pe cel vechi.

Nu decând Java 9. Șirurile compacte au înlocuit matricea internă de caractere cu o matrice de octeți plus un indicator de codare, astfel încât textul Latin-1 pur folosește un octet per caracter. Nimic din API-ul public nu s-a modificat, iar charAt() returnează în continuare un caracter.

Analizatoarele statice de învățare automată semnalează conversiile suspecte pe care le acceptă un compilator, cum ar fi un apel charAt() neprotejat sau o funcție String.valueOf(null) care rezolvă problema supraîncărcării matricei de caractere. Acestea clasifică rezultatele după probabilitate, ceea ce reduce zgomotul unei scanări simple bazate pe reguli.

Copilotul GitHub produce în mod fiabil sugestii simple (one-liner) pentru String.valueOf() și charAt(), dar reproduce și sfaturi învechite din datele sale de antrenament, cum ar fi noul constructor Character(c) depreciat. Compilează fiecare sugestie și citește avertismentele privind deprecierea.

Rezumați această postare cu: