Kako pretvoriti Char u String u Java (Primjeri)
⚡ Pametni sažetak
Pretvaranje znaka u niz znakova u Java potreban je jedan poziv funkcije String.valueOf(myChar) ili Character.toString(myChar). Kretanje u obrnutom smjeru koristi charAt(index), koja izvlači jedan znak iz niza znakova prema njegovoj poziciji.
U ovom tutorijalu proučit ćemo dva kratka programa koji pomiču vrijednost između ta dva načina Java pohranjuje tekst:
- Pretvori znak u niz znakova
- Pretvori niz znakova u znak
Dva tipa nisu zamjenjiva. Char je primitiv koji sadrži točno jednu 16-bitnu UTF-16 kodnu jedinicu, napisanu u jednostrukim navodnicima kao 'g'. String je objekt koji sadrži niz tih kodnih jedinica, napisan u dvostrukim navodnicima kao “Guru99”. Budući da je jedan primitiv, a drugi objekt, nijedno pretvaranje ih ne može premostiti - knjižnična metoda mora obaviti posao i Java nudi po jedan za svaki smjer.
Pretvori znak u niz
Postoji više načina za pretvaranje char u String u JavaInterno a Java String pohranjuje svoj tekst kao niz kodnih jedinica, zbog čega se jedan znak tako lako uklapa u jedan. Znak je 16-bitni neoznačeni tip podataka, širine dva bajta, koji sadrži vrijednosti od 0 do 65,535.
Možemo pretvoriti char u String pomoću dvije metode - statičke metode toString() na klasi Character i statičke metode valueOf() na klasi String. Obje vraćaju potpuno novi String duljine jednog znaka, a dva programa u nastavku ispisuju isti rezultat.
Metoda 1: Korištenje metode toString().
Program u nastavku pohranjuje slovo g u char varijabla i prosljeđuje ga funkciji Character.toString(), koja vraća taj jedan znak kao niz znakova. Kod se može uređivati, stoga promijenite slovo i ponovno ga pokrenite da biste pratili ispis.
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);
}
}
Očekivani rezultat:
String is: g
Metoda 2: Korištenje metode valueOf().
Drugi program zamjenjuje String.valueOf(myChar) i ne mijenja ništa drugo. Budući da Java 9 dva poziva su ista operacija: Character.toString(char) je implementiran kao poziv String.valueOf(char), tako da nijedan nije mjerljivo brži od drugog.
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);
}
}
Očekivani rezultat:
String is: g
Drugi načini pretvaranja znaka u niz znakova
Još četiri rute pojavljuju se u starijem kodu i u pitanjima na intervjuima. Sve rade, ali nijedna se ne čita tako jasno kao dvije gore navedene metode, a dvije od njih dodjeljuju više nego što je potrebno.
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); } }
Očekivani rezultat:
gggg
Tablica navodi kada se koja ruta isplati koristiti.
| način | Primjer | Bilješke |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | Preporučeno. Jedan poziv, bez dodatnog objekta izvan vraćenog niza. |
| Znak.uString(znak) | Znak.uString(mojZnak) | Jednako dobro. Dostupno od Java 1.4 i delegata na String.valueOf od Java 9. |
| povezan u lanac | mojZnak + "" | Radi i dalje Java U verzijama 9 i novijim kompajlira se u poziv invokedynamic umjesto u StringBuilder, tako da staro upozorenje da je sporo više ne vrijedi. I dalje skriva namjeru. |
| Omotač znakova | Znak.vrijednost(mojZnak).uString() | BoxPrvo se koristi char. Koristite Character.valueOf, a ne novi konstruktor Character(char), čije je uklanjanje zastarjelo od Java 9. |
| niz znakova | novi niz znakova(novi znak[]{mojZnak}) | Dodjeljuje niz i kopira ga. Rezervira ga za slučaj kada već imate niz znakova. |
| String.format | String.format("%c", mojZnak) | Daleko najsporiji, jer se niz formata analizira tijekom izvođenja. Korisno samo kada je znak dio većeg predloška. |
Nakon što smo pokrili oba smjera pretvorbe jednog znaka, slijedi obrnuta operacija.
Pretvori niz u char
String možemo pretvoriti u char pomoću metode charAt() klase String. Metoda uzima indeks koji se temelji na nuli i vraća char koji se nalazi na toj poziciji, tako da čitanje svakog znaka znači WCping od 0 do length() minus jedan. Zahtjev za indeks ispod 0 ili na length() i iznad izbacuje StringIndexOutOfBoundsException.
Program u nastavku obilazi niz znakova Guru99 jednu poziciju odjednom i ispisuje svaki znak s njegovim indeksom.
//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);
}
}
}
Očekivani rezultat:
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
Imajte na umu da se niz znakova (String) ne može jednostavno pretvoriti: char c = (char) myStr; se ne kompajlira, jer je String objekt, a char je primitiv. Za String za koji se već zna da sadrži točno jedan znak, charAt(0) je cijeli odgovor.
Pretvori string u niz znakova i natrag
Kada je svaki znak potreban odjednom, a ne jedan indeks odjednom, toCharArray() vraća vrijednost natrag novi niz znakovaPretvaranje tog niza natrag u tekst je zadatak konstruktora String(char[]) ili String.valueOf(char[]), a oba kopiraju niz obrambeno, tako da kasnije izmjene niza ne mijenjaju 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)); } }
Očekivani rezultat:
6 G Guru99 Guru99 Guru
Četvrta metoda, getChars(srcBegin, srcEnd, dst, dstBegin), kopira raspon u polje koje već posjedujete umjesto da dodijelite novo. Završni indeks je isključiv, zbog čega getChars(0, 4, part, 0) vraća Guru više nego Guru9. Izvan raspona granica baca iznimku IndexOutOfBoundsException.
Tri pristupa se razlikuju uglavnom po onome što dodjeljuju, kao što je sažeto u nastavku.
| Zadatak | poziv | Što dodjeljuje |
|---|---|---|
| Niz znakova u niz znakova | myStr.toCharArray() | Novi niz; siguran na praznom nizu, gdje vraća niz nulte duljine. |
| niz znakova u niz znakova | novi String(znakovi) ili String.vrijednost(znakovi) | Novi niz znakova plus interna kopija niza. |
| Raspon u postojeći niz | myStr.getChars(0, 4, dio, 0) | Ništa novo; zapisuje u niz koji ste naveli. |
Uobičajene pogreške prilikom pretvaranja char i String u Java
Većina problema u ovim konverzijama dolazi od šest ponavljajućih pogrešaka, a ne od samih metoda. Tablica svaku od njih uparuje s rješenjem.
| Problem | Izazvati | Popraviti |
|---|---|---|
| nekompatibilni tipovi: String se ne može pretvoriti u char | Pokušaj pretvaranja, kao što je char c = (char) myStr; | Umjesto toga pozovite myStr.charAt(0). Nema pretvaranja između objekta i primitive. |
| Iznimka StringIndexOutOfBounds | charAt() pozvan s negativnim indeksom ili s length() na praznom nizu znakova | Zaštitite se s isEmpty() ili usporedite indeks s length() prije čitanja. |
| String.valueOf(null) baca NullPointerException | Goli null odgovara preopterećenju char[], što je najspecifičnije | Napišite String.valueOf((Object) null) kada želite doslovni tekst null. |
| Character.toString(65) vraća A, a ne 65 | Java 11 dodano je preopterećenje Character.toString(int) koje čita svoj argument kao Unicode kodnu točku | Za znamenke 65 koristite String.valueOf(65) ili Integer.toString(65). |
| Emoji se ispisuje kao dva iskrivljena simbola | Znakovi iznad U+FFFF zauzimaju dva znaka, visoki surogat nakon kojeg slijedi niski surogat. | Pročitajte vrijednost pomoću codePointAt(0), a zatim je ponovno izgradite pomoću Character.toString(codePoint) Java 11. i kasnije. |
| Upozorenje o zastarivanju za novi znak (myChar) | Konstruktor Character(char) je zastario od Java 9 i označeno za uklanjanje | Koristite Character.valueOf(myChar) ili neka autoboxing osigura omotač. |
Ista klasa String podržava mnoštvo susjednih vježbi: obrnuto kretanje niza pomoću rekurzije, uspoređivanje dva niza znakovai ispis formatiranog izlaza.
