Kuinka muuntaa merkki merkkijonoksi Java (Esimerkkejä)

⚡ Älykäs yhteenveto

Merkin muuntaminen merkkijonoksi Java suorittaa yhden kutsun funktiolle String.valueOf(myChar) tai Character.toString(myChar). Vastakkaiseen suuntaan liikkuminen käyttää funktiota charAt(index), joka nostaa merkkijonosta yhden merkin sen sijainnin perusteella.

  • 🔘 Merkkijono.arvoOf: String.valueOf(myChar) palauttaa yksimerkkisen merkkijonon ja ilmaisee muunnoksen tarkoituksen selkeimmin.
  • ☑️ Merkki.merkkijonoksi: Character.toString(myChar) tekee saman työn ja koska Java 9, delegoi yksinkertaisesti String.valueOf-funktioon.
  • ✅ charAt: charAt(index) palauttaa merkin nollapohjaisella paikalla ja heittää StringIndexOutOfBoundsException-poikkeuksen, jos merkki on kelvollisen alueen ulkopuolella.
  • 🧪 char-taulukot: toCharArray() jakaa merkkijonon char-taulukoksi ja new String(chars) rakentaa tekstin uudelleen tästä taulukosta.
  • 🛠️ Ei valua: Merkkijonoa (String) ei voida koskaan muuntaa char-tyyppiksi (char), koska merkkijono on olio eikä siihen liittyvä alkeistyyppi.
  • 📌 Unicode-rajoitus: Yksi merkki sisältää yhden 16-bittisen UTF-16-koodiyksikön, joten emoji tarvitsee kaksi merkkiä tai Character.toString(codePoint)-metodin.

Java koodi, joka muuntaa merkin merkkijonoksi ja merkkijonon takaisin merkiksi

Tässä opetusohjelmassa tutkimme kahta lyhyttä ohjelmaa, jotka siirtävät arvoa kahden suunnan välillä Java kauppojen teksti:

  1. Muunna merkki merkkijonoksi
  2. Muunna merkkijono merkiksi

Nämä kaksi tyyppiä eivät ole keskenään vaihdettavissa. Char on primitiivi, joka sisältää täsmälleen yhden 16-bittisen UTF-16-koodiyksikön, joka kirjoitetaan lainausmerkkeihin muodossa 'g'. Merkkijono on objekti, joka sisältää näiden koodiyksiköiden sarjan, joka kirjoitetaan lainausmerkkeihin muodossa "Guru99”. Koska toinen on primitiivinen ja toinen olio, mikään muunnos ei voi yhdistää niitä – kirjastometodin on tehtävä työ, ja Java toimittaa yhden kumpaankin suuntaan.

Muunna merkki merkkijonoksi

Merkin voi muuntaa merkkijonoksi monella tapaa JavaSisäisesti a Java Merkkijono tallentaa tekstinsä koodiyksiköiden taulukkona, minkä vuoksi yksi merkki sopii niin helposti yhteen. Merkki on 16-bittinen etumerkitön tietotyyppi, joka on kaksi tavua leveä ja sisältää arvoja väliltä 0 - 65 535.

Voimme muuntaa char-merkin merkkijonoksi kahdella metodilla — Character-luokan static toString()-metodilla ja String-luokan static valueOf()-metodilla. Molemmat palauttavat uuden, yhden merkin pituisen merkkijonon, ja alla olevat kaksi ohjelmaa tulostavat saman tuloksen.

Tapa 1: Käytä toString()-metodia

Alla oleva ohjelma tallentaa g-kirjaimen char muuttuja ja välittää sen Character.toString()-funktiolle, joka palauttaa kyseisen yksittäisen merkin merkkijonona. Koodi on muokattavissa, joten muuta kirjain ja suorita se uudelleen nähdäksesi tulosteen seuraavan.

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

Odotettu tulos:

String is: g

Tapa 2: ValueOf()-menetelmän käyttö

Toinen ohjelma vaihtaa String.valueOf(myChar)-funktion eikä muuta mitään muuta. Koska Java 9 Nämä kaksi kutsua ovat sama operaatio: Character.toString(char) on toteutettu String.valueOf(char)-kutsuna, joten kumpikaan ei ole mitattavasti nopeampi kuin toinen.

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

Odotettu tulos:

String is: g

Muita tapoja muuntaa merkki merkkijonoksi

Vanhemmassa koodissa ja haastattelukysymyksissä esiintyy neljä muuta menetelmää. Ne kaikki toimivat, mutta mikään niistä ei ole yhtä selkeä kuin kaksi yllä olevaa menetelmää, ja kaksi niistä varaa enemmän resursseja kuin tarvitaan.

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

Odotettu tuotos:

gggg

Taulukossa on esitetty, milloin kutakin reittiä kannattaa käyttää.

Menetelmä esimerkki Huomautuksia
String.valueOf(merkki) String.valueOf(myChar) Suositellaan. Yksi kutsu, ei ylimääräisiä objekteja palautetun merkkijonon lisäksi.
Merkki.merkkijonoksi(merkki) Merkki.merkkijonoksi(myChar) Yhtä hyvä. Saatavilla vuodesta Java 1.4 ja delegoi String.valueOf-funktiolle koska Java 9.
ketju myChar + “” Toimii ja toimii Java 9 ja uudemmat versiot kääntävät sen invokedynamic-kutsulla StringBuilderin sijaan, joten vanha varoitus sen hitaudesta ei enää päde. Se piilottaa edelleen tarkoituksen.
Merkkien kääre Merkki.arvo(myChar).merkkijonoksi() Boxes merkki ensin. Käytä Character.valueOf-funktiota, äläkä uutta Character(char)-konstruktoria, joka on vanhentunut poistettavaksi vuodesta Java 9.
merkkijono new String(new char[]{myChar}) Varaa taulukon ja kopioi sen. Varaa tämä tapaukseen, jossa sinulla on jo char-taulukko.
Merkkijono.muoto String.format("%c", myChar) Ylivoimaisesti hitain, koska muotoilumerkkijono jäsennetään suorituksen aikana. Hyödyllinen vain silloin, kun merkki on osa suurempaa mallipohjaa.

Kun yksimerkkimuunnoksen molemmat suunnat on käsitelty, seuraavaksi suoritetaan käänteinen operaatio.

Muunna merkkijono merkiksi

Voimme muuntaa merkkijonon char-muotoon käyttämällä String-luokan charAt()-metodia. Metodi ottaa nollapohjaisen indeksin ja palauttaa kyseisessä kohdassa olevan char-merkin, joten jokaisen merkin lukeminen tarkoittaa vessaping nollasta ylöspäin arvoon length() miinus yksi. Indeksin pyytäminen, joka on alle nollan tai jonka arvo on length() tai suurempi, aiheuttaa StringIndexOutOfBoundsException-poikkeuksen.

Alla oleva ohjelma kävelee narulla Guru99 yksi merkki kerrallaan ja tulostaa jokaisen merkin indekseineen.

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

Odotettu tuotos:

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

Huomaa, että merkkijonoa (String) ei voida yksinkertaisesti muuntaa: char c = (char) myStr; ei käänny, koska merkkijono on olio ja char on primitiivi. Jos merkkijonon tiedetään sisältävän täsmälleen yhden merkin, charAt(0) on koko vastaus.

Muunna merkkijono merkkijonotaulukoksi ja takaisin

Kun jokaista merkkiä tarvitaan kerralla yhden indeksin sijaan kerrallaan, toCharArray() palauttaa tuore char-matriisiTaulukon muuttaminen takaisin tekstiksi on String(char[])-konstruktorin tai String.valueOf(char[]):n tehtävä, ja molemmat kopioivat taulukon puolustustarkoituksessa, joten taulukon myöhemmät muutokset eivät muuta merkkijonoa.

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

Odotettu tuotos:

6
G
Guru99
Guru99
Guru

Neljäs metodi, getChars(srcBegin, srcEnd, dst, dstBegin), kopioi alueen jo omistamaasi taulukkoon uuden varaamisen sijaan. Loppuindeksi on poissulkeva, minkä vuoksi getChars(0, 4, part, 0) tuottaa Guru sen sijaan, Guru9. Alueen ulkopuoliset rajat heittävät IndexOutOfBoundsException-poikkeuksen.

Nämä kolme lähestymistapaa eroavat toisistaan ​​pääasiassa siinä, mihin ne allokoivat resursseja, kuten alla on tiivistetty.

Tehtävä Puhelu Mitä se allokoi
Merkkijonosta merkkijonoon -taulukko myStr.toCharArray() Uusi taulukko; turvallinen tyhjälle merkkijonolle, jossa se palauttaa nollan pituisen taulukon.
merkkijono char-taulukosta merkkijonoon uusi merkkijono(merkit) tai merkkijono.arvo(merkit) Uusi merkkijono ja sisäinen kopio taulukosta.
Alue olemassa olevaan taulukkoon myStr.getChars(0, 4, osa, 0) Ei mitään uutta; se kirjoittaa antamaasi taulukkoon.

Yleisiä virheitä char- ja string-muotojen muuntamisessa Java

Suurin osa näiden muunnosten ongelmista johtuu kuudesta toistuvasta virheestä eikä niinkään itse metodeista. Taulukossa on yhdistetty jokainen niistä ja niiden korjaus.

Ongelma Aiheuttaa Korjata
Yhteensopimattomat tyypit: Merkkijonoa ei voida muuntaa char-muotoon Yritys muuntaa, kuten char c = (char) myStr; Kutsu sen sijaan funktiota myStr.charAt(0). Objektin ja primitiivin välillä ei ole muunnoksia.
Merkkijonoindeksin rajojen ulkopuolinen poikkeus charAt()-funktiota kutsutaan negatiivisella indeksillä tai length()-funktiolla tyhjän merkkijonon kohdalla Suojaa isEmpty()-funktiolla tai vertaa indeksiä length()-funktioon ennen lukemista.
String.valueOf(null) heittää NullPointerException-poikkeuksen Bare null vastaa char[] overloadia, joka on tarkin. Kirjoita String.valueOf((Object) null), kun literaaliteksti on haluamasi funktio.
Character.toString(65) palauttaa luvun A, ei 65 Java Versiossa 11 lisättiin Character.toString(int)-ylikuormitus, joka lukee argumenttinsa Unicode-koodipisteenä Käytä String.valueOf(65)- tai Integer.toString(65)-funktiota numeroille 65.
Emoji tulostuu kahtena sekavana symbolina U+FFFF:n yläpuolella olevat merkit käyttävät kahta merkkiä: korkean korvikkeen ja sen jälkeen matalan korvikkeen. Lue arvo funktiolla codePointAt(0) ja muodosta se sitten uudelleen funktiolla Character.toString(codePoint) Java 11 ja myöhemmät.
Vanhentumisvaroitus uudelle merkille (myChar) Character(char)-konstruktori on vanhentunut vuodesta Java 9 ja merkitty poistettavaksi Käytä Character.valueOf(myChar)-funktiota tai anna autoboxingin toimittaa kääre.

Sama String-luokka tukee useita rinnakkaisia ​​harjoituksia: merkkijonon kääntäminen rekursion avulla, kahden merkkijonon vertailuja muotoillun tulosteen tulostaminen.

UKK

Char on primitiivi, joka sisältää yhden 16-bittisen UTF-16-koodiyksikön, joka on kirjoitettu lainausmerkkeihin. Merkkijono on objekti, joka sisältää näiden yksiköiden sarjan, joka on kirjoitettu lainausmerkkeihin, ja se sisältää metodeja, kuten length() ja charAt(), joita primitiivi ei pysty käyttämään.

Ei. Koska Java 9. Character.toString(char) on toteutettu kutsuna funktiolle String.valueOf(char), joten molemmat suorittavat samaa koodia. Valitse se, kumpi lukee paremmin siinä kohdassa, missä työskentelet; String.format(“%c”, c) on ainoa reitti, joka on todella hidas.

Char tallentaa yhden 16-bittisen koodiyksikön, ja emoji sijaitsee U+FFFF:n yläpuolella. Java jakaa ne sijaispariksi, jolloin ne vievät kaksi merkkiä. Lue koodipiste funktiolla codePointAt() ja muodosta teksti uudelleen funktiolla Character.toChars() tai Character.toString(codePoint).

Jousi A. Java Versiossa 11 on lisätty int-ylikuormitus, joka lukee argumenttinsa Unicode-koodipisteenä, ja 65 on A:n koodipiste. String.valueOf(65) palauttaa sen sijaan numerot 65, mikä tekee näistä kahdesta kutsusta helposti sekoitettavia.

Yhdistä se plus-operaattorilla tai kutsu append()-funktiota StringBuilderissa, kun yhteenlasku tapahtuu silmukan sisällä. Java Merkkijono on muuttumaton, joten jokainen ketjutus allokoi uuden objektin vanhan laajentamisen sijaan.

Ei siitä lähtien Java 9. Tiivistetyt merkkijonot korvasivat sisäisen char-taulukon tavutaulukolla ja koodauslipulla, joten puhdas Latin-1-teksti käyttää yhtä tavua merkkiä kohden. Julkisessa API:ssa ei ole tapahtunut mitään muutoksia, ja charAt() palauttaa edelleen char-merkin.

Koneoppimiseen perustuvat staattiset analysaattorit merkitsevät kääntäjän hyväksymät epäilyttävät muunnokset, kuten suojaamattoman charAt()-kutsu tai String.valueOf(null)-kutsu, joka ratkaisee char-taulukon ylikuormituksen. Ne luokittelevat löydökset todennäköisyyden mukaan, mikä vähentää tavallisen sääntöpohjaisen skannauksen aiheuttamaa kohinaa.

GitHub Copilot tuottaa luotettavasti String.valueOf()- ja charAt()-funktioilla tehtyjä yhden rivin lausekkeita, mutta se myös toistaa vanhentuneita neuvoja harjoitusdatastaan, kuten vanhentuneen uuden Character(c)-konstruktorin. Käännä jokainen ehdotus ja lue vanhenemisvaroitukset.

Tiivistä tämä viesti seuraavasti: