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.
Tässä opetusohjelmassa tutkimme kahta lyhyttä ohjelmaa, jotka siirtävät arvoa kahden suunnan välillä Java kauppojen teksti:
- Muunna merkki merkkijonoksi
- 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.
