Kuidas teisendada tähemärki stringiks Java (Näited)

⚡ Nutikas kokkuvõte

Tähemärgi teisendamine stringiks Java võtab ühe kutse funktsioonile String.valueOf(myChar) või Character.toString(myChar). Vastupidises suunas liikumiseks kasutatakse funktsiooni charAt(index), mis tõmbab stringist ühe märgi selle positsiooni järgi.

  • 🔘 String.valueOf: String.valueOf(myChar) tagastab ühetähemärgilise stringi ja väljendab konverteerimise eesmärki kõige selgemini.
  • ☑️ Märk.stringiks: Character.toString(myChar) teeb sama tööd ja kuna Java 9, delegeerib lihtsalt String.valueOf-ile.
  • ✅ charAt: charAt(index) tagastab nullipõhisel positsioonil oleva märgi ja viskab StringIndexOutOfBoundsException'i väljaspool kehtivat vahemikku.
  • 🧪 märkide massiivid: toCharArray() jagab stringi char-massiiviks ja new String(chars) loob teksti sellest massiivist uuesti.
  • 🛠️ Valamist ei toimu: Stringi ei saa kunagi char-iks teisendada, sest string on pigem objekt kui seotud primitiivne tüüp.
  • 📌 Unicode'i piirang: Üks märk sisaldab ühte 16-bitist UTF-16 koodiühikut, seega vajab emotikon kahte märki või Character.toString(codePoint).

Java kood, mis teisendab tähemärgi stringiks ja stringi tagasi tähemärgiks

Selles õpetuses uurime kahte lühikest programmi, mis liigutavad väärtust kahe suuna vahel Java kaupluste tekst:

  1. Teisenda märk stringiks
  2. Teisenda string tähemärgiks

Need kaks tüüpi ei ole omavahel asendatavad. Char on primitiivikood, mis sisaldab täpselt ühte 16-bitist UTF-16 koodiühikut, mis on kirjutatud ülakomade vahel kujul 'g'. String on objekt, mis sisaldab nende koodiühikute jada, mis on kirjutatud jutumärkide vahel kujul „Guru99”. Kuna üks on primitiivne ja teine ​​objekt, ei saa ükski teisendus neid ühendada – töö peab ära tegema teegimeetod ja Java varustab ühe iga suuna jaoks.

Teisendage täht stringiks

Tähemärgi stringiks teisendamiseks on mitu võimalust JavaSisemiselt a Java String salvestab oma teksti koodiühikute massiivina, mistõttu üksik märk sobib nii kergesti ühte massiivi. Märk on 16-bitine kahe baiti laiune märgita andmetüüp, mis sisaldab väärtusi vahemikus 0 kuni 65 535.

Me saame tähemärgi (char) stringiks teisendada kahe meetodi abil — staatilise toString() meetodi abil Character klassis ja staatilise valueOf() meetodi abil String klassis. Mõlemad tagastavad uue ühe tähemärgi pikkuse stringi ja kaks allolevat programmi väljastavad sama tulemuse.

1. meetod: meetodi toString() kasutamine

Allolev programm salvestab g-tähe a-sse. char muutuja ja edastab selle funktsioonile Character.toString(), mis tagastab selle üksiku tähemärgi stringina. Koodi saab muuta, seega muutke tähte ja käivitage see uuesti, et näha väljundit.

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

Eeldatav väljund:

String is: g

2. meetod: ValueOf() meetodi kasutamine

Teine programm vahetab String.valueOf(myChar) väärtuse ja ei muuda midagi muud. Kuna Java 9 on need kaks kutset sama toiming: Character.toString(char) on rakendatud String.valueOf(char) kutse asemel, seega pole kumbki mõõdetavalt kiirem kui teine.

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

Eeldatav väljund:

String is: g

Muud viisid märgi stringiks teisendamiseks

Vanemas koodis ja intervjuuküsimustes ilmneb veel neli meetodit. Need kõik toimivad, kuid ükski neist ei ole nii selgelt loetav kui kaks ülaltoodud meetodit ja kaks neist eraldavad rohkem ressurssi kui vaja.

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

Eeldatav väljund:

gggg

Tabelis on kirjas, millal iga marsruuti tasub kasutada.

Meetod Näide märkused
String.valueOf(märk) String.valueOf(minuMärk) Soovitatav. Üks kutse, tagastatud stringile lisaks pole ühtegi lisaobjekti.
Märk.stringiks(märk) Märk.stringiks(minuMärk) Sama hea. Saadaval alates Java 1.4 ja delegeerib String.valueOf-ile alates Java 9.
Liitmine minuChar + “” Töötab ja edasi Java 9 ja hilisemad versioonid kompileerivad selle invokedynamic kutse asemel StringBuilderiks, seega vana hoiatus selle aeglase olemuse kohta enam ei kehti. See peidab endiselt tegelikku eesmärki.
Märgiümbris Character.valueOf(myChar).toString() Boxes märgista esmalt char. Kasuta Character.valueOf, mitte uut Character(char) konstruktorit, mis on alates ...-st aegunud ja eemaldatud. Java 9.
märkide massiiv uus string(uus märk[]{minuMärk}) Eraldab massiivi ja kopeerib selle. Reserveerib selle juhuks, kui sul on juba olemas char-massiiv.
String.format String.format("%c", minuChar) Kaugelt kõige aeglasem, kuna vormingustringi parsitakse käitusajal. Kasulik ainult siis, kui märk on osa suuremast mallist.

Kui ühe tähemärgi teisendamise mõlemad suunad on kaetud, on järgmisena tegemist vastupidise toiminguga.

Teisenda string tähemärgiks

Stringi saab teisendada tähemärgiks (char), kasutades String-klassi meetodit charAt(). Meetod võtab nullpõhise indeksi ja tagastab sellel positsioonil oleva tähemärgi (char), seega iga tähemärgi lugemine tähendab looping 0-st kuni length() miinus üheni. Indeksi küsimine väärtusega alla 0 või väärtusega length() ja sellest suurem tekitab StringIndexOutOfBoundsException'i.

Allolev programm kõnnib nööril Guru99 üks positsioon korraga ja prindib iga märgi koos indeksiga.

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

Eeldatav väljund:

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

Pane tähele, et stringi ei saa lihtsalt teisendada: char c = (char) myStr; ei kompileeru, sest string on objekt ja char on primitiivne. Stringi puhul, mis teadaolevalt sisaldab täpselt ühte märki, on kogu vastus charAt(0).

Stringi teisendamine tähemärkide massiiviks ja tagasi

Kui iga märki on vaja korraga, mitte ühte indeksit korraga, annab toCharArray() tagasi värske sümboolne massiivSelle massiivi tagasi tekstiks muutmine on String(char[]) konstruktori või String.valueOf(char[]) ülesanne ning mõlemad kopeerivad massiivi kaitsvalt, nii et hilisemad massiivi muudatused ei muuda stringi.

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

Eeldatav väljund:

6
G
Guru99
Guru99
Guru

Neljas meetod, getChars(srcBegin, srcEnd, dst, dstBegin), kopeerib vahemiku juba olemasolevasse massiivi uue eraldamise asemel. Lõppindeks on eksklusiivne, mistõttu getChars(0, 4, part, 0) annab tulemuseks Guru mitte Guru9. Leviala piiridest väljas olevad piirid viskavad „IndexOutOfBoundsException”.

Need kolm lähenemisviisi erinevad peamiselt selle poolest, millele nad eraldavad, nagu allpool kokku võetud.

Ülesanne Helista Mida see eraldab
Stringist char-massiiv minuStr.märgimassiiviks() Uus massiiv; turvaline tühjal stringil, kus see tagastab nullpikkusega massiivi.
tähestiku massiiv stringiks uus String(tähed) või String.valueOf(tähed) Uus string pluss massiivi sisemine koopia.
Vahemik olemasolevasse massiivi myStr.getChars(0, 4, osa, 0) Midagi uut pole; see kirjutab sinu antud massiivi.

Levinud vead char ja string teisendamisel Java

Enamik nende konversioonide probleemidest tuleneb pigem kuuest korduvast veast kui meetoditest endist. Tabelis on iga viga koos parandusega paaristatud.

Probleem Põhjus Määrama
Ühildamatud tüübid: stringi ei saa teisendada tähemärgiks Katse teisendada, näiteks char c = (char) myStr; Selle asemel kutsume välja funktsiooni myStr.charAt(0). Objekti ja primitiivi vahel ei ole teisendust.
StringIndexOutOfBoundsException charAt() kutsutakse välja negatiivse indeksiga või length() abil tühja stringi korral Enne lugemist valva isEmpty() funktsiooniga või võrdle indeksit length() funktsiooniga.
String.valueOf(null) viskab NullPointerExceptioni Paljas null vastab char[] ülekoormusele, mis on kõige spetsiifilisem. Kirjuta String.valueOf((Object) null), kui literaaltekst null on see, mida sa tahad.
Character.toString(65) tagastab A, mitte 65 Java 11 lisas Character.toString(int) ülekoormuse, mis loeb oma argumendi Unicode'i koodipunktina Numbrite 65 jaoks kasutage funktsiooni String.valueOf(65) või Integer.toString(65).
Emotikon prinditakse kahe moonutatud sümbolina U+FFFF-ist kõrgemad tähemärgid hõivavad kaks tähemärki: kõrge asendusmärgi ja seejärel madala asendusmärgi. Loe väärtust funktsiooniga codePointAt(0) ja seejärel loo see uuesti funktsiooniga Character.toString(codePoint) Java 11 ja hiljem.
Uue tähemärgi (myChar) aegumise hoiatus Character(char) konstruktor on aegunud alates Java 9 ja eemaldamiseks märgitud Kasuta Character.valueOf(myChar) või lase autoboxingil ümbrise pakkuda.

Sama String klass toetab paljusid naaberharjutusi: stringi ümberpööramine rekursiooniga, kahe stringi võrdlemineja vormindatud väljundi printimine.

KKK

Char on primitiivi kood, mis sisaldab ühte 16-bitist UTF-16 koodiühikut, mis on kirjutatud ülakomade vahel. String on objekt, mis sisaldab nende ühikute jada, mis on kirjutatud topeltkomade vahel, ning see sisaldab meetodeid nagu length() ja charAt(), mida primitiivi kood ei saa kasutada.

Ei. Alates Java 9, Character.toString(char) on rakendatud String.valueOf(char) funktsiooni kutsumisena, seega käivitavad need kaks sama koodi. Vali see, mis sinu asukohas paremini loeb; String.format(“%c”, c) on ainus marsruut, mis on tõeliselt aeglane.

Üks märk salvestab ühe 16-bitise koodiüksuse ja emotikonid asuvad U+FFFF kohal. Java jagab need asenduspaariks, nii et nad hõivavad kaks tähemärki. Loe koodipunkti funktsiooniga codePointAt() ja ehita tekst uuesti funktsiooniga Character.toChars() või Character.toString(codePoint).

Keel A. Java Versioonile 11 lisati int-ülekoormuse võti, mis loeb oma argumendi Unicode'i koodipunktina ja 65 on A koodipunkt. String.valueOf(65) tagastab hoopis numbrid 65, mis muudab need kaks käsku kergesti segi aetavaks.

Kui liitmine toimub tsükli sees, ühenda see plussmärgiga või kutsu StringBuilderis välja append(). Java String on muutumatu, seega iga liitmine eraldab uue objekti, mitte ei laienda vana.

Mitte sellest ajast alates Java 9. Kompaktsed stringid asendasid sisemise tähemärkide massiivi baitimassiivi ja kodeerimislipuga, seega puhas Ladina-1 tekst kasutab ühte baiti tähemärgi kohta. Avalikus API-s ei muutunud midagi ja charAt() tagastab endiselt tähemärgi.

Masinõppe staatilised analüsaatorid märgistavad kahtlaseid konversioone, mida kompilaator aktsepteerib, näiteks kaitsmata charAt() kutse või String.valueOf(null), mis lahendab char-massiivi ülekoormuse. Nad järjestavad leiud tõenäosuse järgi, mis vähendab tavalise reeglipõhise skaneerimise müra.

GitHubi koopia genereerib usaldusväärselt String.valueOf() ja charAt() üherealisi märksõnu, aga see taastoodab ka aegunud nõuandeid oma treeningandmetest, näiteks aegunud uut Character(c) konstruktorit. Kompileeri kõik soovitused ja loe aegumise hoiatusi.

Võta see postitus kokku järgmiselt: