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.

  • 🔘 String.valueOf: String.valueOf(myChar) vraća niz od jednog znaka i najjasnije navodi namjeru pretvorbe.
  • ☑️ Znak.u.niz: Character.toString(myChar) radi isti posao i, budući da Java 9, jednostavno delegira na String.valueOf.
  • ✅ charAt: charAt(index) vraća znak na poziciji koja počinje s nulom i izbacuje StringIndexOutOfBoundsException izvan valjanog raspona.
  • 🧪 nizovi znakova: toCharArray() dijeli String u niz znakova, a new String(chars) ponovno gradi tekst iz tog niza.
  • 🛠️ Bez lijevanja: String se nikada ne može pretvoriti u char, jer je String objekt, a ne povezani primitivni tip.
  • 📌 Unicode ograničenje: Znak sadrži jednu 16-bitnu UTF-16 kodnu jedinicu, tako da emoji treba dva znaka ili Character.toString(codePoint).

Java kod koji pretvara char u String i String natrag u char

U ovom tutorijalu proučit ćemo dva kratka programa koji pomiču vrijednost između ta dva načina Java pohranjuje tekst:

  1. Pretvori znak u niz znakova
  2. 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.

Pitanja i odgovori

Char je primitiv koji sadrži jednu 16-bitnu UTF-16 kodnu jedinicu, napisanu u jednostrukim navodnicima. String je objekt koji sadrži niz tih jedinica, napisan u dvostrukim navodnicima, i sadrži metode poput length() i charAt() koje primitiv ne može.

Ne. Od Java 9, Character.toString(char) je implementiran kao poziv String.valueOf(char), tako da oba pokreću isti kod. Odaberite onaj koji vam se bolje čita tamo gdje radite; String.format("%c", c) je jedina ruta koja je zaista spora.

Znak pohranjuje jednu 16-bitnu kodnu jedinicu, a emoji se nalazi iznad U+FFFF. Java dijeli ih u surogatni par, tako da zauzimaju dva znaka. Pročitajte kodnu točku s codePointAt() i ponovno izgradite tekst s Character.toChars() ili Character.toString(codePoint).

Žica A. Java 11 je dodao int preopterećenje koje čita svoj argument kao Unicode kodnu točku, a 65 je kodna točka za A. String.valueOf(65) vraća znamenke 65 umjesto toga, što čini dva poziva lakom zabunu.

Spojite ga s operatorom plus ili pozovite append() na StringBuilderu kada se zbrajanje dogodi unutar petlje. Java Niz znakova je nepromjenjiv, pa svako spajanje dodjeljuje novi objekt umjesto da proširuje stari.

Ne od tada Java 9. Kompaktni nizovi znakova zamijenili su interni niz znakova nizom bajtova plus zastavicom kodera, tako da čisti Latin-1 tekst koristi jedan bajt po znaku. Ništa se u javnom API-ju nije promijenilo, a charAt() i dalje vraća znak.

Statički analizatori strojnog učenja označavaju sumnjive konverzije koje kompajler prihvaća, kao što je nezaštićeni poziv charAt() ili String.valueOf(null) koji se rješava preopterećenjem polja znakova. Oni rangiraju nalaze prema vjerojatnosti, što smanjuje buku običnog skeniranja temeljenog na pravilima.

GitHub kopilot pouzdano generira jednolinijske rečenice tipa String.valueOf() i charAt(), ali također reproducira zastarjele savjete iz svojih podataka za obuku, poput zastarjelog novog konstruktora Character(c). Kompajlirajte svaki prijedlog i pročitajte upozorenja o zastarjelosti.

Sažmite ovu objavu uz: