Hogyan alakítsuk át a karaktert karaktersorozattá Java (Példák)

⚡ Okos összefoglaló

Karakter konvertálása karakterlánccá Java egyetlen hívást fogad a String.valueOf(myChar) vagy a Character.toString(myChar) függvényre. Az ellenkező irányba történő mozgás a charAt(index) függvényt használja, amely egy karaktert húz ki a Stringből a pozíciója alapján.

  • 🔘 String.valueOf: A String.valueOf(myChar) egy egykarakteres karakterláncot ad vissza, és a lehető legvilágosabban meghatározza a konverzió szándékát.
  • ☑️ Karakter.karakterláncba: A Character.toString(myChar) függvény ugyanazt a feladatot látja el, és mivel Java 9-es verzióban egyszerűen a String.valueOf-ba delegál.
  • karakterAt: A charAt(index) visszaadja a nulla alapú karaktert, és StringIndexOutOfBoundsException kivételt dob ​​az érvényes tartományon kívül.
  • 🧪 karakter tömbök: A toCharArray() függvény egy String elemet egy char tömbre bont, és az new String(chars) ebből a tömbből építi fel a szöveget.
  • 🇧🇷 Nincs öntés: Egy String soha nem alakítható karakterré, mivel a String egy objektum, nem pedig egy kapcsolódó primitív típus.
  • 📌 Unicode-korlát: Egy karakter egy 16 bites UTF-16 kódegységet tartalmaz, tehát egy emojinak két karakterre vagy Character.toString(codePoint) metódusra van szüksége.

Java kód, amely egy karaktert karakterlánccá, majd egy karakterláncot vissza karakterré alakít

Ebben az oktatóanyagban két rövid programot fogunk tanulmányozni, amelyek egy értéket mozgatnak a két irány között. Java áruházak szövege:

  1. Karakter konvertálása karakterlánccá
  2. Karakterlánc átalakítása karakterré

A két típus nem felcserélhető. A char egy primitív objektum, amely pontosan egy 16 bites UTF-16 kódegységet tartalmaz, amelyet aposztrófok között, 'g' alakban írunk. A String egy olyan objektum, amely ezen kódegységek sorozatát tartalmazza, amelyet dupla aposztrófok között, 'g' alakban írunk.Guru99”. Mivel az egyik egy primitív, a másik pedig egy objektum, egyetlen konverzió sem tudja áthidalni őket – egy könyvtármetódusnak kell elvégeznie a munkát, és Java mindkét irányhoz egyet-egyet biztosít.

Char konvertálása karakterláncra

Többféleképpen is lehet karaktert karakterlánccá konvertálni JavaBelsőleg a Java A karakterlánc tárolja a szövegét kódegységek tömbjeként, ezért illeszthető be egyetlen karakter olyan könnyen egy tömbbe. A char egy 16 bites, előjel nélküli adattípus, két bájt széles, 0 és 65 535 közötti értékeket tartalmaz.

Egy karaktert két metódussal konvertálhatunk stringgé — a Character osztály static toString() metódusával, és a String osztály static valueOf() metódusával. Mindkettő egy vadonatúj, egy karakter hosszú stringet ad vissza, és az alábbi két program ugyanazt az eredményt írja ki.

1. módszer: A toString() metódus használata

Az alábbi program a g betűt egy char változó és átadja a Character.toString() függvénynek, amely karakterláncként adja vissza ezt az egyetlen karaktert. A kód szerkeszthető, ezért változtasd meg a betűt és futtasd újra, hogy lásd a kimenetet.

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

Várható kimenet:

String is: g

2. módszer: ValueOf() metódus használata

A második program kicseréli a String.valueOf(myChar) változót, és semmi mást nem változtat meg. Mivel Java 9 a két hívás ugyanaz a művelet: a Character.toString(char) függvényt a String.valueOf(char) függvény hívásaként valósítjuk meg, így egyik sem mérhetően gyorsabb a másiknál.

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

Várható kimenet:

String is: g

További módszerek karakter karakterlánccá konvertálására

Négy további módszer bukkan fel régebbi kódokban és interjúkérdésekben. Mindegyik működik, de egyik sem olvasható olyan egyértelműen, mint a fenti két módszer, és kettő közülük többet foglal le a kelleténél.

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

Várható teljesítmény:

gggg

A táblázat tartalmazza, hogy mikor érdemes az egyes útvonalakat használni.

Módszer Példa Megjegyzések
String.valueOf(karakter) String.valueOf(sajátKarakter) Ajánlott. Egy hívás, a visszaadott karakterláncon túl nincs további objektum.
Karakter.karakterlánccá(karakter) Karakter.toString(myChar) Ugyanilyen jó. Elérhető azóta Java 1.4 és a String.valueOf-ba delegál, mivel Java 9.
láncolat myChar + “” Működik, és tovább Java A 9-es és újabb verziókban invokedynamic hívásra fordul StringBuilder helyett, így a régi figyelmeztetés, hogy lassú, már nem áll fenn. Továbbra is elrejti a szándékot.
Karakterburkoló Karakter.értéke(myChar).toString() Boxelőször a karaktert használd. Használd a Character.valueOf konstruktort, ne az új Character(char) konstruktort, amely elavulttá vált a 2000 óta tartó eltávolítás miatt. Java 9.
karakter tömb új karakterlánc(új karakter[]{sajátKarakter}) Lefoglal egy tömböt és lemásolja azt. Fenntartja arra az esetre, ha már van egy karakter tömböd.
Karakterlánc.formátum String.format(„%c”, myChar) Messze a leglassabb, mivel a formátum karakterláncot futási időben elemzi a rendszer. Csak akkor hasznos, ha a karakter egy nagyobb sablon része.

Miután az egykarakteres konverzió mindkét irányát lefedtük, a következő lépés a fordított művelet.

Karakterlánc konvertálása karakterré

A String osztály charAt() metódusával karakterré alakíthatunk egy karakterláncot. A metódus egy nulla alapú indexet vesz fel, és visszaadja az adott pozícióban lévő karaktert, tehát minden karakter beolvasása azt jelenti, hogy vécéping 0-tól egészen length() mínusz egyig. 0 alatti vagy length() feletti index bekérése StringIndexOutOfBoundsException kivételt eredményez.

Az alábbi program a húron sétál Guru99 karakterenként, és minden karaktert indexszel együtt nyomtat ki.

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

Várható teljesítmény:

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

Megjegyzendő, hogy egy String nem egyszerűen konvertálható: char c = (char) myStr; nem fordul le, mivel a String egy objektum, a char pedig egy primitív. Egy olyan String esetében, amelyről már tudjuk, hogy pontosan egy karaktert tartalmaz, a charAt(0) a teljes válasz.

Karakterlánc átalakítása karaktertömbdé és vissza

Amikor minden karakterre egyszerre van szükség, nem pedig egyenkénti indexre, a toCharArray() visszaadja egy friss karaktertömbA tömb szöveggé alakítása a String(char[]) konstruktor vagy a String.valueOf(char[]) feladata, és mindkettő védekezően másolja a tömböt, így a tömb későbbi szerkesztései nem változtatják meg a karakterláncot.

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

Várható teljesítmény:

6
G
Guru99
Guru99
Guru

Egy negyedik metódus, a getChars(srcBegin, srcEnd, dst, dstBegin) egy tartományt másol egy már meglévő tömbbe egy új lefoglalása helyett. A záró index kizáró, ezért a getChars(0, 4, part, 0) eredménye Guru helyett Guru9. A tartományon kívüli határok IndexOutOfBoundsException kivételt eredményeznek.

A három megközelítés főként abban különbözik, hogy mit allokálnak, az alábbiakban összefoglalva.

Feladat Hívás Mit oszt ki
Karakterláncból karakter tömb myStr.toCharArray() Egy új tömb; biztonságosan használható üres karakterláncon, ahol nulla hosszúságú tömböt ad vissza.
karakter tömbből karakterláncba új String(karakterek) vagy String.valueOf(karakterek) Egy új karakterlánc plusz a tömb belső másolata.
Tartomány egy meglévő tömbben myStr.getChars(0, 4, rész, 0) Semmi újdonság; a megadott tömbbe ír.

Gyakori hibák a char és a String konvertálásakor Java

Az ilyen konverziókkal kapcsolatos problémák nagy része hat visszatérő hibából ered, nem pedig magukból a metódusokból. A táblázat mindegyiket párosítja a javítással.

Probléma Okoz Rögzít
inkompatibilis típusok: A karakterlánc nem konvertálható karakterré Egy konvertálási kísérlet, például char c = (char) myStr; Ehelyett hívd meg a myStr.charAt(0) függvényt. Nincs konverzió az objektum és a primitív között.
KarakterláncIndexKivételOutOfBoundsKivétel A charAt() függvényt negatív indexszel, vagy üres karakterlánc esetén a length() függvényt hívjuk meg. Olvasás előtt védd az isEmpty() függvénnyel, vagy hasonlítsd össze az indexet a length() függvénnyel.
A String.valueOf(null) kivételt dob ​​NullPointerException-re A bare null megegyezik a char[] túlterheléssel, ami a legspecifikusabb. Írd ki a String.valueOf((Object) null) függvényt, ha a literál szövege null, amit keresel.
A Character.toString(65) függvény A értéket ad vissza, nem 65-öt. Java A 11-es verzióban hozzáadtunk egy Character.toString(int) túlterhelést, amely az argumentumát Unicode kódpontként olvassa be. Használd a String.valueOf(65) vagy az Integer.toString(65) függvényt a 65-ös számjegyekhez.
Egy emoji két összekevert szimbólumként jelenik meg a kinyomtatás során Az U+FFFF feletti karakterek két karaktert foglalnak el, egy magas helyettesítőt, majd egy alacsony helyettesítőt. Olvasd be az értéket a codePointAt(0) függvénnyel, majd építsd újra a Character.toString(codePoint) függvénnyel. Java 11 és később.
Elavulási figyelmeztetés az új karakter (myChar) esetén A Character(char) konstruktor elavult óta Java 9 és eltávolításra jelölve Használd a Character.valueOf(myChar) függvényt, vagy hagyd, hogy az autoboxing adja meg a wrappert.

Ugyanaz a String osztály számos szomszédos gyakorlatot támogat: karakterlánc megfordítása rekurzióval, két karakterlánc összehasonlításaés formázott kimenet nyomtatása.

GYIK

A char egy primitív objektum, amely egyetlen 16 bites UTF-16 kódegységet tartalmaz, aposztrófok között írva. A String egy olyan objektum, amely ezen egységek sorozatát tartalmazza, dupla aposztrófok között írva, és olyan metódusokat hordoz, mint a length() és a charAt(), amelyeket egy primitív nem tud.

Nem. Mivel Java 9-es esetben a Character.toString(char) függvény a String.valueOf(char) függvény hívásaként van implementálva, így a kettő ugyanazt a kódot futtatja. Azt válaszd, amelyik jobban olvasható ott, ahol dolgozol; a String.format(„%c”, c) az egyetlen valóban lassú útvonal.

Egy karakter egy 16 bites kódegységet tárol, az emojik pedig az U+FFFF felett helyezkednek el. Java Egy helyettesítő párra osztja őket, így azok két karaktert foglalnak el. Olvasd be a kódpontot a codePointAt() függvénnyel, és építsd újra a szöveget a Character.toChars() vagy a Character.toString(codePoint) függvénnyel.

A húr. Java A 11-es verzióban egy int túlterhelést (overload) adtak hozzá, amely Unicode kódpontként olvassa be az argumentumát, és a 65 az A kódpontja. A String.valueOf(65) ehelyett a 65-ös számjegyeket adja vissza, ami megkönnyíti a két hívás összekeverését.

Fűzd össze a plusz operátorral, vagy hívd meg az append() függvényt egy StringBuilderben, amikor az összeadás egy cikluson belül történik. Java A karakterlánc megváltoztathatatlan, így minden összefűzés egy új objektumot foglal le a régi kiterjesztése helyett.

Azóta nem Java 9. A kompakt karakterláncok a belső karaktertömböt egy bájttömbbel és egy kódolójelzővel helyettesítették, így a tiszta Latin-1 szöveg karakterenként egy bájtot használ. A nyilvános API-ban semmi sem változott, és a charAt() továbbra is egy karaktert ad vissza.

A gépi tanuláson alapuló statikus elemzők jelzik a fordító által elfogadott gyanús konverziókat, például egy védelem nélküli charAt() hívást vagy egy String.valueOf(null) hívást, amely a char tömb túlterhelését okozza. A találatokat valószínűség szerint rangsorolják, ami csökkenti a sima szabályalapú vizsgálat zaját.

GitHub másodpilóta megbízhatóan állítja elő a String.valueOf() és charAt() egysoros értékeket, de elavult tanácsokat is reprodukál a betanítási adataiból, például az elavult új Character(c) konstruktort. Fordítsd le az összes javaslatot, és olvasd el az elavultsági figyelmeztetéseket.

Foglald össze ezt a bejegyzést a következőképpen: