Hvordan konvertere Char til String i Java (Eksempler)

⚡ Smart oppsummering

Konvertering av et tegn til en streng i Java tar et enkelt kall til String.valueOf(myChar) eller Character.toString(myChar). Bevegelse i motsatt retning bruker charAt(index), som trekker ett tegn ut av en streng etter posisjon.

  • 🔘 String.verdiAv: String.valueOf(myChar) returnerer en streng på ett tegn og angir hensikten med konverteringen tydeligst.
  • ☑️ Tegn.tilString: Character.toString(myChar) gjør den samme jobben, og siden Java 9, delegerer ganske enkelt til String.valueOf.
  • ✅ charAt: charAt(index) returnerer tegnet på en nullbasert posisjon og kaster StringIndexOutOfBoundsException utenfor det gyldige området.
  • 🧪 char-arrayer: toCharArray() deler en streng inn i en char-array, og new String(chars) gjenoppbygger teksten fra den arrayen.
  • 🛠️ Ingen avstøpning: En streng kan aldri castes til et tegn, fordi en streng er et objekt snarere enn en relatert primitiv type.
  • 📌 Unicode-grense: Et tegn inneholder én 16-bit UTF-16-kodeenhet, så en emoji trenger to tegn eller Character.toString(codePoint).

Java kode som konverterer et tegn til en streng og en streng tilbake til et tegn

I denne veiledningen skal vi studere to korte programmer som flytter en verdi mellom de to måtene Java lagrer tekst:

  1. Konverter et tegn til en streng
  2. Konverter en streng til et tegn

De to typene er ikke utskiftbare. Et tegn er en primitiv som inneholder nøyaktig én 16-bit UTF-16-kodeenhet, skrevet i enkle anførselstegn som 'g'. En streng er et objekt som inneholder en sekvens av disse kodeenhetene, skrevet i doble anførselstegn som “Guru99”. Fordi den ene er en primitiv og den andre et objekt, kan ingen rollebesetning bygge bro mellom dem – en bibliotekmetode må gjøre jobben, og Java leverer én for hver retning.

Konverter Char til String

Det finnes flere måter å konvertere et tegn til en streng på JavaInternt a Java Streng lagrer teksten sin som en matrise av kodeenheter, og det er derfor et enkelt tegn så lett kan settes inn i en. Et tegn er en 16-bits usignert datatype, to byte bred, som inneholder verdier fra 0 til 65 535.

Vi kan konvertere et tegn til en streng ved hjelp av to metoder – den statiske toString()-metoden på Character-klassen og den statiske valueOf()-metoden på String-klassen. Begge returnerer en helt ny streng som er ett tegn lang, og de to programmene nedenfor skriver ut det samme resultatet.

Metode 1: Bruk av toString()-metoden

Programmet nedenfor lagrer bokstaven g i en char variabel og sender den til Character.toString(), som returnerer det ene tegnet som en streng. Koden er redigerbar, så endre bokstaven og kjør den på nytt for å se resultatet følge.

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

Forventet utgang:

String is: g

Metode 2: Bruker metoden valueOf().

Det andre programmet bytter inn String.valueOf(myChar) og endrer ingenting annet. Siden Java 9 er de to kallene den samme operasjonen: Character.toString(char) implementeres som et kall til String.valueOf(char), så ingen av dem er målbart raskere enn den andre.

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

Forventet utgang:

String is: g

Andre måter å konvertere et tegn til en streng på

Fire ytterligere ruter dukker opp i eldre kode og i intervjuspørsmål. De fungerer alle, men ingen av dem er like tydelige som de to metodene ovenfor, og to av dem allokerer mer enn de trenger.

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

Forventet utgang:

gggg

Tabellen viser når hver rute er verdt å bruke.

Metode Eksempel Merknader
String.verdiAv(char) String.verdiAv(minKar) Anbefales. Ett kall, ingen ekstra objekter utover den returnerte strengen.
Tegn.tilString(char) Tegn.tilString(minTegn) Like bra. Tilgjengelig siden Java 1.4 og delegerer til String.valueOf siden Java 9.
sammenkjeding mittChar + «» Fungerer, og videre Java 9 og senere kompilerer den til et invokedynamic-kall i stedet for en StringBuilder, så den gamle advarselen om at den er treg gjelder ikke lenger. Den skjuler fortsatt intensjonen.
Tegninnpakning Character.valueAv(myChar).toString() Boxes tegnet først. Bruk Character.valueOf, ikke den nye Character(char)-konstruktøren, som har blitt avskrevet for fjerning siden Java 9.
char-array ny streng(ny char[]{myChar}) Tildeler en array og kopierer den. Reserverer den for tilfellet der du allerede har en char-array.
String.format String.format("%c", myChar) Den klart tregeste, fordi formatstrengen analyseres under kjøring. Nyttig bare når tegnet er en del av en større mal.

Med begge retninger for konverteringen av enkelttegn dekket, er den motsatte operasjonen det neste.

Konverter streng til tegn

Vi kan konvertere en streng til et tegn ved å bruke charAt()-metoden i String-klassen. Metoden tar en nullbasert indeks og returnerer tegnet som står på den posisjonen, så å lese hvert tegn betyr looping fra 0 opp til length() minus én. Hvis man ber om en indeks under 0 eller på length() og over, utløses StringIndexOutOfBoundsException.

Programmet nedenfor går strengen Guru99 én posisjon om gangen og skriver ut hvert tegn med indeksen.

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

Forventet utgang:

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 at en streng ikke bare kan castes: char c = (char) myStr; kompilerer ikke, fordi en streng er et objekt og en char er en primitiv. For en streng som allerede er kjent for å inneholde nøyaktig ett tegn, er charAt(0) hele svaret.

Konverter en streng til en char-array og tilbake

Når hvert tegn trengs samtidig i stedet for én indeks om gangen, gir toCharArray() tilbake en ny char-matriseÅ gjøre den arrayen om til tekst igjen er jobben til String(char[])-konstruktøren eller String.valueOf(char[]), og begge kopierer arrayet defensivt, slik at senere redigeringer av arrayet ikke endrer strengen.

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

Forventet utgang:

6
G
Guru99
Guru99
Guru

En fjerde metode, getChars(srcBegin, srcEnd, dst, dstBegin), kopierer et område inn i en array du allerede eier i stedet for å tildele en ny. Sluttindeksen er eksklusiv, og det er derfor getChars(0, 4, part, 0) gir Guru snarere enn Guru9. Utenfor rekkeviddegrenser utløser IndexOutOfBoundsException.

De tre tilnærmingene skiller seg hovedsakelig fra hverandre i hva de tildeler, som oppsummert nedenfor.

Oppgave Anrop Hva den tildeler
Streng til tegnmatrise myStr.toCharArray() En ny array; trygg på en tom streng, der den returnerer en array med lengde null.
char-array til streng ny String(tegn) eller String.verdiAv(tegn) En ny streng pluss en intern kopi av arrayet.
Område i en eksisterende matrise myStr.getChars(0, 4, part, 0) Ikke noe nytt; den skriver inn i arrayet du oppgir.

Vanlige feil ved konvertering av tegn og strenger Java

Mesteparten av problemene med disse konverteringene kommer fra seks gjentakende feil snarere enn fra selve metodene. Tabellen kobler hver enkelt med rettelsen.

Problem Årsak Fix
inkompatible typer: Strengen kan ikke konverteres til tegn Et forsøk på å caste, for eksempel char c = (char) myStr; Kall myStr.charAt(0) i stedet. Det er ingen konvertering mellom et objekt og en primitiv.
StringIndexOutOfBoundsException charAt() kalt med en negativ indeks, eller med length() på en tom streng Beskytt med isEmpty() eller sammenlign indeksen mot length() før lesing.
String.valueOf(null) kaster NullPointerException Den bare null-verdien samsvarer med char[]-overbelastningen, som er den mest spesifikke Skriv String.valueOf((Object) null) når den bokstavelige teksten null er det du ønsker.
Tegn.tilString(65) returnerer A, ikke 65 Java 11 la til en Character.toString(int)-overbelastning som leser argumentet som et Unicode-kodepunkt Bruk String.valueOf(65) eller Integer.toString(65) for sifrene 65.
En emoji skrives ut som to forvrengte symboler Tegn over U+FFFF opptar to tegn, en høy surrogat etterfulgt av en lav surrogat Les verdien med codePointAt(0), og bygg den deretter opp igjen med Character.toString(codePoint) på Java 11 og senere.
Avskrivningsadvarsel for ny karakter (myChar) Character(char)-konstruktøren har blitt avskrevet siden Java 9 og merket for fjerning Bruk Character.valueOf(myChar), eller la autoboxing levere wrapperen.

Den samme strengklassen støtter mange nærliggende øvelser: reversere en streng med rekursjon, sammenligne to strengerog utskrift av formatert utdata.

Spørsmål og svar

Et char er en primitiv som inneholder én 16-bit UTF-16-kodeenhet, skrevet i enkle anførselstegn. En streng er et objekt som inneholder en sekvens av disse enhetene, skrevet i doble anførselstegn, og den inneholder metoder som length() og charAt() som en primitiv ikke kan.

Nei. Siden Java 9, Character.toString(char) implementeres som et kall til String.valueOf(char), slik at de to kjører samme kode. Velg den som leser best der du jobber; String.format("%c", c) er den eneste ruten som er virkelig treg.

Et tegn lagrer én 16-bits kodeenhet, og emojier sitter over U+FFFF. Java deler dem inn i et surrogatpar, slik at de opptar to tegn. Les kodepunktet med codePointAt() og gjenoppbygg teksten med Character.toChars() eller Character.toString(codePoint).

Streng A. Java 11 la til en int-overload som leser argumentet sitt som et Unicode-kodepunkt, og 65 er kodepunktet for A. String.valueOf(65) returnerer sifrene 65 i stedet, noe som gjør det enkelt å forveksle de to kallene.

Koble den sammen med plussoperatoren, eller kall append() på en StringBuilder når addisjonen skjer inne i en løkke. Java Strengen er uforanderlig, så hver sammenkobling tildeler et nytt objekt i stedet for å utvide det gamle.

Ikke siden Java 9. Kompakte strenger erstattet den interne char-matrisen med en byte-matrise pluss et kodeflagg, slik at ren Latin-1-tekst bruker én byte per tegn. Ingenting i det offentlige API-et ble endret, og charAt() returnerer fortsatt et tegn.

Statiske analysatorer for maskinlæring flagger mistenkelige konverteringer som en kompilator godtar, for eksempel et ubeskyttet charAt()-kall eller en String.valueOf(null) som løser opp til char-arrayoverbelastningen. De rangerer funn etter sannsynlighet, noe som reduserer støyen fra en vanlig regelbasert skanning.

GitHub Copilot produserer pålitelig String.valueOf() og charAt() one-liners, men den reproduserer også utdaterte råd fra treningsdataene, for eksempel den utdaterte nye Character(c) konstruktøren. Kompiler alle forslag og les advarslene om utdatering.

Oppsummer dette innlegget med: