Jak převést znak na řetězec v Java (Příklady)
⚡ Chytré shrnutí
Převod typu char na řetězec v Java vyžaduje jedno volání String.valueOf(myChar) nebo Character.toString(myChar). Pohyb v opačném směru používá charAt(index), který vytáhne jeden znak z řetězce podle jeho pozice.

V tomto tutoriálu se budeme zabývat dvěma krátkými programy, které přesouvají hodnotu mezi těmito dvěma způsoby. Java ukládá text:
- Převod znaku na řetězec
- Převod řetězce na znak
Tyto dva typy nejsou zaměnitelné. Typ char je primitiv, který obsahuje přesně jednu 16bitovou kódovou jednotku UTF-16, zapsanou v jednoduchých uvozovkách jako 'g'. Typ String je objekt, který obsahuje posloupnost těchto kódových jednotek, zapsanou v dvojitých uvozovkách jako „Guru99“. Protože jeden je primitiv a druhý objekt, žádné přetypování je nemůže překlenout – práci musí vykonat knihovní metoda a Java dodává jeden pro každý směr.
Převést znak na řetězec
Existuje několik způsobů, jak převést char na String v JavaInterně a Java Řetězec ukládá svůj text jako pole kódových jednotek, a proto se jeden znak tak snadno začlení do dalšího. Znak je 16bitový datový typ bez znaménka, široký dva bajty, který obsahuje hodnoty od 0 do 65 535.
Typ typu char můžeme převést na řetězec pomocí dvou metod – statické metody toString() třídy Character a statické metody valueOf() třídy String. Obě vracejí zcela nový řetězec o délce jednoho znaku a dva níže uvedené programy vypíší stejný výsledek.
Metoda 1: Použití metody toString().
Níže uvedený program ukládá písmeno g do proměnná char a předá ho funkci Character.toString(), která vrátí daný znak jako řetězec. Kód je upravitelný, takže změňte písmeno a spusťte jej znovu, abyste sledovali, jak se výstup bude řídit.
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čekávaný výstup:
String is: g
Metoda 2: Použití metody valueOf().
Druhý program zamění String.valueOf(myChar) a nic jiného nemění. Protože Java 9 obě volání jsou stejnou operací: Character.toString(char) je implementováno jako volání String.valueOf(char), takže ani jedno není měřitelně rychlejší než druhé.
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čekávaný výstup:
String is: g
Jiné způsoby převodu znaku na řetězec
Čtyři další metody se objevují ve starším kódu a v otázkách v pohovorech. Všechny fungují, ale žádná z nich se nečte tak srozumitelně jako dvě výše uvedené metody a dvě z nich alokují více, než je potřeba.
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čekávaný výstup:
gggg
Tabulka uvádí, kdy se vyplatí kterou trasu použít.
| Metoda | Příklad | Poznámky |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | Doporučeno. Jedno volání, žádný další objekt nad rámec vráceného řetězce. |
| Znak.naŘetězec(znak) | Znak.naŘetězec(myChar) | Stejně dobré. K dispozici od Java 1.4 a deleguje na String.valueOf od té doby Java 9. |
| Zřetězení | můjZnak + „“ | Funguje a pokračuje Java Od verze 9 a novějších se kompiluje do volání invokedynamic namísto StringBuilderu, takže staré varování, že je pomalý, už neplatí. Stále to skrývá záměr. |
| Obal znaku | HodnotaCharakteru(myChar).toString() | BoxNejprve se použije char. Použijte Character.valueOf, nikoli nový konstruktor Character(char), jehož odstranění bylo zastaralé od roku 2006. Java 9. |
| pole znaků | nový řetězec(nový znak[]{mujZnak}) | Alokuje pole a zkopíruje ho. Rezervuje to pro případ, že již máte pole typu char. |
| String.format | String.format("%c", myChar) | Zdaleka nejpomalejší, protože formátovací řetězec je analyzován za běhu. Užitečné pouze tehdy, když je znak součástí větší šablony. |
Po pokrytí obou směrů jednoznakové konverze přichází na řadu obrácená operace.
Převést řetězec na char
Typ String můžeme převést na typ char pomocí metody charAt() třídy String. Metoda bere index založený na nule a vrací znak na dané pozici, takže čtení každého znaku znamená toaletaping od 0 do hodnoty length() mínus jedna. Dotaz na index pod 0 nebo na hodnotě length() a výše vyvolá výjimku StringIndexOutOfBoundsException.
Níže uvedený program prochází řetězec Guru99 po jedné pozici a vytiskne každý znak s jeho indexem.
//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čekávaný výstup:
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
Všimněte si, že řetězec nelze jednoduše přetypovat: char c = (char) myStr; se nekompiluje, protože řetězec je objekt a char je primitiv. Pro řetězec, o kterém je již známo, že obsahuje přesně jeden znak, je charAt(0) celou odpovědí.
Převod řetězce na pole typu char a zpět
Pokud je potřeba každý znak najednou, a ne jeden index po druhém, funkce toCharArray() vrací zpět nové pole znakůPřevedení tohoto pole zpět do textu je úkolem konstruktoru String(char[]) nebo String.valueOf(char[]) a oba zkopírují pole defenzivně, takže pozdější úpravy pole nemění řetězec.
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čekávaný výstup:
6 G Guru99 Guru99 Guru
Čtvrtá metoda, getChars(srcBegin, srcEnd, dst, dstBegin), kopíruje rozsah do pole, které již vlastníte, místo aby alokovala nové. Koncový index je exkluzivní, a proto getChars(0, 4, part, 0) vrací výsledek. Guru spíše než Guru9. Překročení hranic rozsahu vyvolá výjimku IndexOutOfBoundsException.
Tyto tři přístupy se liší hlavně v tom, co přidělují, jak je shrnuto níže.
| Úkol | volání | Co přiděluje |
|---|---|---|
| Řetězec do pole znaků | myStr.toCharArray() | Nové pole; bezpečné pro prázdný řetězec, kde vrací pole nulové délky. |
| pole znaků na řetězec | nový String(chars) nebo String.valueOf(chars) | Nový řetězec plus interní kopie pole. |
| Rozsah do existujícího pole | myStr.getChars(0, 4, část, 0) | Nic nového; zapisuje se do pole, které zadáte. |
Časté chyby při převodu typů char a String v Java
Většina problémů s těmito konverzemi pramení spíše ze šesti opakujících se chyb než ze samotných metod. Tabulka uvádí každou z nich s opravou.
| Problém | Způsobit | Opravit |
|---|---|---|
| nekompatibilní typy: String nelze převést na char | Pokus o přetypování, například char c = (char) myStr; | Místo toho volejte myStr.charAt(0). Mezi objektem a primitivem není žádné přetypování. |
| Výjimka StringIndexOutOfBoundsException | charAt() volána se záporným indexem nebo s length() na prázdném řetězci | Před čtením použijte funkci isEmpty() nebo porovnejte index s funkcí length(). |
| Funkce String.valueOf(null) vyvolá výjimku NullPointerException. | Holá hodnota null odpovídá přetížení char[], což je nejkonkrétnější hodnota. | Napište String.valueOf((Object) null), když je požadovaný doslovný text null. |
| Funkce Character.toString(65) vrací A, nikoli 65. | Java Verze 11 přidala přetížení Character.toString(int), které čte svůj argument jako kód Unicode. | Pro číslici 65 použijte String.valueOf(65) nebo Integer.toString(65). |
| Emoji se tiskne jako dva zkreslené symboly | Znaky nad U+FFFF zabírají dva znaky, horní zástupný znak následovaný dolním zástupným znakem. | Přečtěte hodnotu pomocí codePointAt(0) a poté ji znovu sestavte pomocí Character.toString(codePoint) Java 11 a později. |
| Varování o zastarání nového znaku (myChar) | Konstruktor Character(char) je od roku 2004 zastaralý. Java 9 a označeno k odstranění | Použijte Character.valueOf(myChar) nebo nechte autoboxing dodat wrapper. |
Stejná třída String podporuje spoustu sousedních cvičení: obrácení řetězce rekurzí, porovnání dvou řetězců, a tisk formátovaného výstupu.
