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: