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.

  • 🔘 String.valueOf: String.valueOf(myChar) vrací jednoznakový řetězec a nejjasněji uvádí záměr převodu.
  • ☑️ Znak.naŘetězec: Character.toString(myChar) dělá stejnou práci a od té doby Java 9, jednoduše deleguje na String.valueOf.
  • (Tj. charAt: charAt(index) vrací znak na pozici začínající na nule a vyvolá výjimku StringIndexOutOfBoundsException mimo platný rozsah.
  • 🧪 pole znaků: toCharArray() rozdělí String do pole typu char a new String(chars) znovu sestaví text z tohoto pole.
  • 🛠️ Žádné odlévání: Typ String nelze nikdy přetypovat na typ char, protože String je objekt, nikoli související primitivní typ.
  • 📌 Limit Unicode: Znak obsahuje jednu 16bitovou kódovou jednotku UTF-16, takže emoji potřebuje dva znaky nebo Character.toString(codePoint).

Java kód převádějící typ char na řetězec a řetězec zpět na typ char

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:

  1. Převod znaku na řetězec
  2. 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.

Nejčastější dotazy

Char je primitiv obsahující jednu 16bitovou kódovou jednotku UTF-16, zapsanou v jednoduchých uvozovkách. String je objekt obsahující posloupnost těchto jednotek, zapsanou v dvojitých uvozovkách, a obsahuje metody jako length() a charAt(), které primitiv nemůže použít.

Ne. Od té doby Java 9, Character.toString(char) je implementováno jako volání String.valueOf(char), takže obě metody spouštějí stejný kód. Vyberte si tu, která se vám lépe čte tam, kde pracujete; String.format(“%c”, c) je jediná skutečně pomalá cesta.

Znak char ukládá jednu 16bitovou kódovou jednotku a emoji se nachází nad U+FFFF. Java rozdělí je do náhradní dvojice, takže zabírají dva znaky. Přečtěte kódový bod pomocí codePointAt() a znovu sestavte text pomocí Character.toChars() nebo Character.toString(codePoint).

Řetězec A. Java Verze 11 přidala přetížení typu int, které čte svůj argument jako kód Unicode, a 65 je kód pro A. String.valueOf(65) vrací místo toho číslici 65, což snadno ztěžuje záměnu obou volání.

Zřetězte jej pomocí operátoru plus nebo zavolejte append() u StringBuilderu, když se sčítání provádí uvnitř smyčky. Java Řetězec je neměnný, takže každé zřetězení alokuje nový objekt, místo aby rozšiřovalo ten starý.

Od té doby Java 9. Kompaktní řetězce nahradily interní pole znaků polem bajtů a příznakem kodéru, takže čistý text Latin-1 používá jeden bajt na znak. Ve veřejném API se nic nezměnilo a charAt() stále vrací znak.

Statické analyzátory strojového učení označují podezřelé konverze, které kompilátor akceptuje, například nechráněné volání charAt() nebo String.valueOf(null), které se definuje jako přetížené pole char. Řadí nálezy podle pravděpodobnosti, což snižuje šum prostého skenování založeného na pravidlech.

GitHub Copilot Spolehlivě vytváří jednořádkové příkazy String.valueOf() a charAt(), ale také reprodukuje zastaralé rady ze svých trénovacích dat, jako například zastaralý konstruktor new Character(c). Zkompilujte každý návrh a přečtěte si varování o zastaralosti.

Shrňte tento příspěvek takto: