Hoe Char naar String te converteren Java (Voorbeelden)

โšก Slimme samenvatting

Een teken omzetten naar een tekenreeks in Java Dit vereist รฉรฉn enkele aanroep van String.valueOf(myChar) of Character.toString(myChar). In de omgekeerde richting gebruikt men charAt(index), waarmee รฉรฉn teken uit een String wordt gehaald op basis van de positie ervan.

  • ๐Ÿ”˜ String.waardeVan: String.valueOf(myChar) retourneert een tekenreeks van รฉรฉn teken en maakt de bedoeling van de conversie het duidelijkst.
  • โ˜‘๏ธ Character.toString: Character.toString(myChar) doet hetzelfde en, aangezien Java 9, delegeert eenvoudigweg naar String.valueOf.
  • โœ… charAt: charAt(index) retourneert het teken op een nulgebaseerde positie en genereert een StringIndexOutOfBoundsException buiten het geldige bereik.
  • ๐Ÿงช tekenreeksen: toCharArray() splitst een String in een char-array, en newString(chars) herbouwt de tekst vanuit die array.
  • ๏ธ Geen casting: Een String kan nooit worden omgezet naar een char, omdat een String een object is en geen verwant primitief gegevenstype.
  • ๐Ÿ“Œ Unicode-limiet: Een char bevat รฉรฉn 16-bits UTF-16-code-eenheid, dus een emoji heeft twee chars nodig of Character.toString(codePoint).

Java Code die een teken (char) omzet naar een tekenreeks (String) en een tekenreeks (String) weer terug naar een teken (char).

In deze tutorial bestuderen we twee korte programma's die een waarde tussen twee manieren verplaatsen. Java winkeltekst:

  1. Converteer een teken naar een tekenreeks.
  2. Converteer een tekenreeks naar een teken.

De twee typen zijn niet uitwisselbaar. Een char is een primitief type dat precies รฉรฉn 16-bits UTF-16-code-eenheid bevat, tussen enkele aanhalingstekens geschreven als 'g'. Een string is een object dat een reeks van die code-eenheden bevat, tussen dubbele aanhalingstekens geschreven als "".Guru99โ€. Omdat de ene een primitief type is en de andere een object, kan geen typeconversie ze overbruggen โ€” een bibliotheekmethode moet het werk doen, en Java levert er รฉรฉn voor elke richting.

Converteer teken naar tekenreeks

Er zijn meerdere manieren om een โ€‹โ€‹teken naar een tekenreeks te converteren. JavaIntern a Java String slaat zijn tekst op. Een char is een 16-bits, niet-ondertekend gegevenstype, twee bytes breed, dat waarden van 0 tot 65,535 kan bevatten.

We kunnen een char naar een string converteren met behulp van twee methoden: de statische toString()-methode van de Character-klasse en de statische valueOf()-methode van de String-klasse. Beide methoden retourneren een gloednieuwe string van รฉรฉn teken lang, en de twee onderstaande programma's printen hetzelfde resultaat.

Methode 1: De toString()-methode gebruiken

Het onderstaande programma slaat de letter g op in een char variabele en geeft het door aan Character.toString(), die dat ene teken als een String retourneert. De code is bewerkbaar, dus verander de letter en voer het opnieuw uit om de uitvoer te zien.

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);
  }
} 

Verwachte resultaten :

String is: g

Methode 2: Methode valueOf() gebruiken

Het tweede programma vervangt String.valueOf(myChar) door String.valueOf(myChar) en verandert verder niets. Java 9. Beide aanroepen betreffen dezelfde bewerking: Character.toString(char) is geรฏmplementeerd als een aanroep naar String.valueOf(char), dus geen van beide is meetbaar sneller dan de andere.

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);
  }
}

Verwachte resultaten :

String is: g

Andere manieren om een โ€‹โ€‹teken naar een tekenreeks te converteren

In oudere code en in interviewvragen duiken nog vier andere routes op. Ze werken allemaal, maar geen ervan is zo duidelijk leesbaar als de twee bovenstaande methoden, en twee ervan wijzen meer geheugen toe dan nodig is.

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);
  }
}

Verwachte resultaten:

gggg

De tabel geeft aan wanneer elke route de moeite waard is om te gebruiken.

Methode Voorbeeld Notes
String.valueOf(char) String.valueOf(myChar) Aanbevolen. Eรฉn aanroep, geen extra object naast de geretourneerde String.
Karakter.toString(char) Character.toString(myChar) Eveneens goed. Beschikbaar sinds Java 1.4 en delegeert naar String.valueOf sinds Java 9.
Aaneenschakeling myChar + โ€œโ€ Werkt, en op Java Vanaf versie 9 compileert het naar een invokedynamic-aanroep in plaats van een StringBuilder, waardoor de oude waarschuwing dat het traag is niet langer opgaat. Het verbergt echter nog steeds de bedoeling.
Tekenomhulsel Character.valueOf(myChar).toString() BoxGebruik eerst het teken. Gebruik `Character.valueOf`, niet de nieuwe `Character(char)`-constructor, die sinds die tijd is afgekeurd en verwijderd. Java 9.
tekenreeks nieuwe String(nieuwe char[]{myChar}) Hiermee wordt een array toegewezen en gekopieerd. Reserveer deze functie voor het geval je al een char-array hebt.
String.format String.format(โ€œ%cโ€, myChar) Verreweg de traagste methode, omdat de opmaakstring tijdens de uitvoering wordt geparseerd. Alleen bruikbaar wanneer het teken onderdeel is van een grotere sjabloon.

Nu beide richtingen van de conversie van รฉรฉn teken zijn behandeld, is de omgekeerde bewerking aan de beurt.

Converteer tekenreeks naar teken

We kunnen een String naar een char converteren met behulp van de `charAt()`-methode van de `String`-klasse. De methode neemt een index (beginnend bij nul) en retourneert de char op die positie, dus het lezen van elk teken betekent... looping Van 0 tot en met length() min รฉรฉn. Het opvragen van een index lager dan 0 of gelijk aan of hoger dan length() resulteert in een StringIndexOutOfBoundsException.

Het onderstaande programma doorloopt de tekenreeks. GuruHet programma verwerkt positie voor positie 99 en print elk teken met de bijbehorende index.

//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);
	      }
 
	}
 
}

Verwachte resultaten:

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

Merk op dat een String niet zomaar gecast kan worden: `char c = (char) myStr;` compileert niet, omdat een String een object is en een char een primitief gegevenstype. Voor een String waarvan al bekend is dat deze precies รฉรฉn teken bevat, is `charAt(0)` het volledige antwoord.

Een tekenreeks omzetten naar een tekenreeksarray en weer terug.

Wanneer elk teken tegelijk nodig is in plaats van index voor index, geeft toCharArray() het volgende terug een nieuwe tekenreeksHet omzetten van die array terug naar tekst is de taak van de String(char[])-constructor of String.valueOf(char[]), en beide kopiรซren de array op een beschermende manier, zodat latere bewerkingen aan de array de String niet wijzigen.

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));
  }
}

Verwachte resultaten:

6
G
Guru99
Guru99
Guru

Een vierde methode, getChars(srcBegin, srcEnd, dst, dstBegin), kopieert een bereik naar een array die je al hebt, in plaats van een nieuwe array aan te maken. De eindindex is exclusief, vandaar dat getChars(0, 4, part, 0) het volgende resultaat oplevert: Guru dan Guru9. Bij overschrijding van de grenzen wordt een IndexOutOfBoundsException gegenereerd.

De drie benaderingen verschillen voornamelijk in wat ze toewijzen, zoals hieronder samengevat.

Taak Bel Wat het toewijst
String naar tekenreeks myStr.toCharArray() Een nieuwe array; veilig bij een lege string, waarbij een array met lengte nul wordt geretourneerd.
tekenreeks naar tekenreeks nieuwe String(chars) of String.valueOf(chars) Een nieuwe String plus een interne kopie van de array.
Bereik binnen een bestaande array myStr.getChars(0, 4, part, 0) Niets nieuws; het schrijft naar de array die je opgeeft.

Veelvoorkomende fouten bij het converteren van char en String in Java

De meeste problemen bij deze conversies komen voort uit zes terugkerende fouten, en niet zozeer uit de methoden zelf. De tabel koppelt elke fout aan de bijbehorende oplossing.

probleem Veroorzaken Bepalen
Incompatibele gegevenstypen: String kan niet worden geconverteerd naar char. Een poging tot casten, zoals char c = (char) myStr; Roep in plaats daarvan myStr.charAt(0) aan. Er is geen typeconversie tussen een object en een primitief gegevenstype.
StringIndexOutOfBoundsException charAt() aangeroepen met een negatieve index, of met length() op een lege string Beveilig met isEmpty() of vergelijk de index met length() voordat je gaat lezen.
String.valueOf(null) gooit NullPointerException De kale null komt overeen met de char[]-overload, wat de meest specifieke is. Schrijf String.valueOf((Object) null) als je de letterlijke tekst 'null' wilt.
Character.toString(65) retourneert A, niet 65 Java Versie 11 voegde een Character.toString(int)-overload toe die het argument leest als een Unicode-codepunt. Gebruik String.valueOf(65) of Integer.toString(65) voor de cijfers 65.
Een emoji wordt afgedrukt als twee vervormde symbolen. Karakters boven U+FFFF beslaan twee karakters, een hoog surrogaat gevolgd door een laag surrogaat. Lees de waarde met codePointAt(0) en herbouw deze vervolgens met Character.toString(codePoint). Java 11 en later.
Waarschuwing voor verouderde code bij nieuw personage (myChar) De Character(char)-constructor is sinds die tijd verouderd. Java 9 en gemarkeerd voor verwijdering Gebruik Character.valueOf(myChar), of laat autoboxing de wrapper leveren.

Dezelfde String-klasse biedt ondersteuning voor tal van verwante oefeningen: Een tekenreeks omkeren met behulp van recursie, twee snaren vergelijkenen afdrukken van geformatteerde uitvoer.

Veelgestelde vragen

Een char is een primitief gegevenstype dat รฉรฉn 16-bits UTF-16-code-eenheid bevat, geschreven tussen enkele aanhalingstekens. Een string is een object dat een reeks van die eenheden bevat, geschreven tussen dubbele aanhalingstekens, en het beschikt over methoden zoals length() en charAt() die een primitief gegevenstype niet heeft.

Nee. Sinds Java 9. Character.toString(char) is geรฏmplementeerd als een aanroep naar String.valueOf(char), dus beide voeren dezelfde code uit. Kies de methode die het beste leest in jouw werkomgeving; String.format(โ€œ%cโ€, c) is de enige methode die echt traag is.

Een teken slaat รฉรฉn 16-bits code-eenheid op, en emoji's staan โ€‹โ€‹boven U+FFFF. Java splitst ze op in een surrogaatpaar, zodat ze twee tekens innemen. Lees het codepunt met codePointAt() en herbouw de tekst met Character.toChars() of Character.toString(codePoint).

De snaar A. Java In versie 11 werd een int-overload toegevoegd die het argument leest als een Unicode-codepunt, en 65 is het codepunt voor A. String.valueOf(65) retourneert echter de cijfers 65, waardoor de twee aanroepen gemakkelijk door elkaar gehaald kunnen worden.

Voeg het samen met de plusoperator, of roep append() aan op een StringBuilder wanneer de optelling plaatsvindt binnen een lus. Java Strings zijn onveranderlijk, dus elke samenvoeging creรซert een nieuw object in plaats van het oude uit te breiden.

Niet Sinds Java 9. Compacte strings hebben de interne char-array vervangen door een byte-array plus een coder-vlag, waardoor pure Latin-1-tekst รฉรฉn byte per teken gebruikt. Er is niets veranderd in de openbare API en charAt() retourneert nog steeds een char.

Statische analyseprogramma's gebaseerd op machine learning signaleren verdachte conversies die een compiler accepteert, zoals een onbeveiligde aanroep van `charAt()` of een `String.valueOf(null)` die resulteert in de overbelasting van de `char`-array. Ze rangschikken de bevindingen op waarschijnlijkheid, wat de ruis van een eenvoudige, op regels gebaseerde scan vermindert.

GitHub-copiloot Het programma genereert betrouwbaar String.valueOf() en charAt() one-liners, maar het reproduceert ook verouderde adviezen uit de trainingsdata, zoals de afgekeurde new Character(c) constructor. Compileer elke suggestie en lees de waarschuwingen over verouderde functies.

Vat dit bericht samen met: