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.
În acest tutorial, vom studia două programe scurte care mută o valoare între cele două direcții Java stochează textul:
- Conversia unui caracter într-un șir de caractere
- 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.
