Jak przekonwertować znak na ciąg w Java (Przykłady)
⚡ Inteligentne podsumowanie
Konwersja znaku na ciąg znaków w Java Przyjmuje pojedyncze wywołanie String.valueOf(myChar) lub Character.toString(myChar). Przesuwanie w odwrotnym kierunku wykorzystuje charAt(index), który wyciąga jeden znak z ciągu znaków na podstawie jego pozycji.
W tym samouczku przyjrzymy się dwóm krótkim programom, które przenoszą wartość pomiędzy dwoma sposobami Java przechowuje tekst:
- Konwertuj znak na ciąg
- Konwertuj ciąg na znak
Te dwa typy nie są zamienne. Znak to prymityw przechowujący dokładnie jedną 16-bitową jednostkę kodu UTF-16, zapisaną w cudzysłowie jako „g”. Ciąg to obiekt przechowujący sekwencję tych jednostek kodu, zapisaną w cudzysłowie jako „Guru99”. Ponieważ jeden jest prymitywem, a drugi obiektem, żadne rzutowanie nie może ich połączyć — musi to zrobić metoda biblioteczna, a Java dostarcza po jednym dla każdego kierunku.
Konwertuj znak na ciąg
Istnieje wiele sposobów konwersji znaku na ciąg znaków Java. Wewnętrznie a Java String przechowuje swój tekst jako tablicę jednostek kodu, dlatego pojedynczy znak tak łatwo wpasowuje się w inny. Znak to 16-bitowy typ danych bez znaku, o szerokości dwóch bajtów, przechowujący wartości od 0 do 65 535.
Możemy przekonwertować znak na ciąg znaków za pomocą dwóch metod — statycznej metody toString() w klasie Character i statycznej metody valueOf() w klasie String. Obie zwracają zupełnie nowy ciąg znaków o długości jednego znaku, a oba poniższe programy wyświetlają ten sam wynik.
Metoda 1: Użycie metody toString().
Poniższy program zapisuje literę g w zmienna char i przekazuje go do Character.toString(), która zwraca ten pojedynczy znak jako ciąg znaków. Kod jest edytowalny, więc zmień literę i uruchom ponownie, aby zobaczyć wynik.
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);
}
}
Oczekiwany wynik :
String is: g
Metoda 2: Użycie metody valueOf().
Drugi program zamienia String.valueOf(myChar) i nic więcej nie zmienia. Ponieważ Java 9 oba wywołania to ta sama operacja: Character.toString(char) jest implementowane jako wywołanie String.valueOf(char), więc żadna z nich nie jest mierzalnie szybsza od drugiej.
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);
}
}
Oczekiwany wynik :
String is: g
Inne sposoby konwersji znaku na ciąg znaków
Cztery kolejne ścieżki pojawiają się w starszym kodzie i w pytaniach na rozmowach kwalifikacyjnych. Wszystkie działają, ale żadna z nich nie jest tak czytelna, jak dwie powyższe metody, a dwie z nich przydzielają więcej zasobów niż potrzeba.
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); } }
Oczekiwany wynik:
gggg
W tabeli podano, kiedy warto skorzystać z danej trasy.
| Metoda wykonania | Przykład | Komentarz |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | Zalecane. Jedno wywołanie, bez dodatkowego obiektu poza zwróconym ciągiem znaków. |
| Character.toString(char) | Character.toString(myChar) | Równie dobry. Dostępny od Java 1.4 i deleguje do String.valueOf od Java 9. |
| Powiązanie | myChar + “” | Działa i dalej Java W wersji 9 i nowszych kompiluje się do wywołania invokedynamic, a nie StringBuilder, więc stare ostrzeżenie o powolności już nie obowiązuje. Nadal jednak ukrywa cel. |
| Opakowanie postaci | Character.valueOf(myChar).toString() | BoxNajpierw użyj znaku. Użyj Character.valueOf, a nie konstruktora new Character(char), który został wycofany z użytku. Java 9. |
| tablica znaków | nowy String(nowy char[]{myChar}) | Przydziela tablicę i kopiuje ją. Rezerwuje ją na wypadek, gdybyś już posiadał tablicę znaków. |
| String.format | String.format(“%c”, myChar) | Zdecydowanie najwolniejszy, ponieważ ciąg formatujący jest analizowany w czasie wykonywania. Przydatny tylko wtedy, gdy znak jest częścią większego szablonu. |
Po omówieniu obu kierunków konwersji pojedynczego znaku następna jest operacja odwrotna.
Konwertuj ciąg na znak
Możemy przekonwertować String na znak za pomocą metody charAt() klasy String. Metoda przyjmuje indeks od zera i zwraca znak znajdujący się na tej pozycji, więc odczyt każdego znaku oznacza… looping od 0 do length() minus jeden. Żądanie indeksu poniżej 0 lub na poziomie length() i powyżej powoduje wyjątek StringIndexOutOfBoundsException.
Poniższy program przeszukuje String Guru99 po jednej pozycji na raz i drukuje każdy znak wraz z jego indeksem.
//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);
}
}
}
Oczekiwany wynik:
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
Należy pamiętać, że String nie może być po prostu rzutowany: char c = (char) myStr; nie kompiluje się, ponieważ String jest obiektem, a char jest prymitywem. W przypadku Stringa, o którym wiadomo, że zawiera dokładnie jeden znak, charAt(0) jest odpowiedzią.
Konwertuj ciąg znaków na tablicę znaków i z powrotem
Gdy potrzebny jest każdy znak na raz, a nie jeden indeks na raz, toCharArray() zwraca świeża tablica znaków. Zamiana tej tablicy z powrotem na tekst jest zadaniem konstruktora String(char[]) lub String.valueOf(char[]) i oba kopiują tablicę w celach obronnych, więc późniejsze edycje tablicy nie zmieniają String.
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)); } }
Oczekiwany wynik:
6 G Guru99 Guru99 Guru
Czwarta metoda, getChars(srcBegin, srcEnd, dst, dstBegin), kopiuje zakres do tablicy, którą już posiadasz, zamiast przydzielać nową. Indeks końcowy jest wyłączny, dlatego getChars(0, 4, part, 0) zwraca Guru zamiast Guru9. Przekroczenie zakresu powoduje wyjątek IndexOutOfBoundsException.
Te trzy podejścia różnią się przede wszystkim tym, co przydzielają, co podsumowano poniżej.
| Zadanie | Numer Telefonu | Co przydziela |
|---|---|---|
| Tablica ciągów znaków | myStr.toCharArray() | Nowa tablica; bezpieczna dla pustego ciągu, w którym zwraca tablicę o zerowej długości. |
| tablica znaków na ciąg znaków | nowy String(znaki) lub String.valueOf(znaki) | Nowy ciąg znaków i wewnętrzna kopia tablicy. |
| Zakres do istniejącej tablicy | myStr.getChars(0, 4, część, 0) | Nic nowego; zapisuje do podanej tablicy. |
Typowe błędy podczas konwersji znaków i ciągów znaków Java
Większość problemów z tymi konwersjami wynika z sześciu powtarzających się błędów, a nie z samych metod. Tabela zestawia każdy błąd z rozwiązaniem.
| Problem | Spowodować | Fix |
|---|---|---|
| niezgodne typy: String nie może zostać przekonwertowany na char | Próba rzutowania, np. char c = (char) myStr; | Zamiast tego wywołaj myStr.charAt(0). Nie ma rzutowania między obiektem a prymitywem. |
| Wyjątek StringIndexOutOfBoundsException | charAt() wywoływane z ujemnym indeksem lub z length() na pustym ciągu | Zabezpiecz za pomocą isEmpty() lub porównaj indeks z length() przed odczytaniem. |
| String.valueOf(null) zgłasza wyjątek NullPointerException | Goły null pasuje do przeciążenia char[], które jest najbardziej szczegółowe | Wpisz String.valueOf((Object) null), jeśli chcesz użyć tekstu dosłownego null. |
| Character.toString(65) zwraca A, a nie 65 | Java 11 dodano przeciążenie Character.toString(int), które odczytuje swój argument jako punkt kodowy Unicode | Użyj String.valueOf(65) lub Integer.toString(65) dla cyfr 65. |
| Emoji drukuje się jako dwa niezrozumiałe symbole | Znaki powyżej U+FFFF zajmują dwa znaki: pierwszy znak zastępczy, a następnie drugi znak zastępczy | Odczytaj wartość za pomocą codePointAt(0), a następnie przebuduj ją za pomocą Character.toString(codePoint) Java 11 i później. |
| Ostrzeżenie o wycofaniu nowego znaku (myChar) | Konstruktor Character(char) jest przestarzały od Java 9 i oznaczone do usunięcia | Użyj Character.valueOf(myChar) lub pozwól, aby autoboxing dostarczył wrapper. |
Ta sama klasa String obsługuje wiele sąsiadujących ćwiczeń: odwracanie ciągu za pomocą rekurencji, porównywanie dwóch ciągów znaków, drukowanie sformatowanego wyjścia.
