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.

  • 🔘 String.valueOf: String.valueOf(myChar) zwraca jednoznakowy ciąg znaków i najwyraźniej określa cel konwersji.
  • ️ Znak.toString: Character.toString(myChar) wykonuje tę samą pracę i ponieważ Java 9, po prostu deleguje do String.valueOf.
  • ✅ charAt: charAt(index) zwraca znak w pozycji zerowej i zgłasza wyjątek StringIndexOutOfBoundsException spoza prawidłowego zakresu.
  • 🧪 tablice znaków: toCharArray() dzieli String na tablicę znaków, a new String(chars) odbudowuje tekst z tej tablicy.
  • 🛠️. Brak obsady: Typu String nigdy nie można rzutować na typ char, ponieważ String jest obiektem, a nie powiązanym typem pierwotnym.
  • 📌 Limit Unicode: Każdy znak przechowuje jedną 16-bitową jednostkę kodu UTF-16, więc emoji wymaga dwóch znaków lub metody Character.toString(codePoint).

Java kod konwertujący znak na ciąg i ciąg z powrotem na znak

W tym samouczku przyjrzymy się dwóm krótkim programom, które przenoszą wartość pomiędzy dwoma sposobami Java przechowuje tekst:

  1. Konwertuj znak na ciąg
  2. 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.

FAQ

Typ char to prymityw przechowujący jedną 16-bitową jednostkę kodu UTF-16, zapisaną w pojedynczych cudzysłowach. Ciąg znaków to obiekt przechowujący sekwencję tych jednostek, zapisaną w podwójnych cudzysłowach, który zawiera metody takie jak length() i charAt(), których prymityw nie może zawierać.

Nie. Ponieważ Java 9. Metoda Character.toString(char) jest zaimplementowana jako wywołanie funkcji String.valueOf(char), więc obie uruchamiają ten sam kod. Wybierz tę, która lepiej się czyta w danym momencie; String.format(“%c”, c) to jedyna ścieżka, która jest naprawdę powolna.

Znak przechowuje jedną 16-bitową jednostkę kodu, a emoji znajdują się nad U+FFFF. Java Dzieli je na parę zastępczą, tak aby zajmowały dwa znaki. Odczytaj punkt kodowy za pomocą codePointAt() i przebuduj tekst za pomocą Character.toChars() lub Character.toString(codePoint).

Struna A. Java 11 dodano przeciążenie int, które odczytuje swój argument jako punkt kodowy Unicode, a 65 jest punktem kodowym dla A. Funkcja String.valueOf(65) zwraca zamiast tego cyfry 65, przez co łatwo pomylić te dwa wywołania.

Połącz go z operatorem plus lub wywołaj append() w StringBuilder, gdy dodawanie odbywa się wewnątrz pętli. Java String jest niezmienny, więc każde połączenie powoduje przydzielenie nowego obiektu zamiast rozszerzania starego.

Nie od Java 9. W zwartych ciągach znaków wewnętrzna tablica znaków została zastąpiona tablicą bajtów wraz z flagą kodera, dzięki czemu czysty tekst Latin-1 używa jednego bajtu na znak. Nic w publicznym API się nie zmieniło, a funkcja charAt() nadal zwraca znak.

Statyczne analizatory uczenia maszynowego sygnalizują podejrzane konwersje akceptowane przez kompilator, takie jak niestrzeżone wywołanie charAt() lub String.valueOf(null), które prowadzi do przeciążenia tablicy znaków. Sortują wyniki według prawdopodobieństwa, co eliminuje szum wynikający ze zwykłego skanowania opartego na regułach.

Drugi pilot GitHub Niezawodnie generuje jednolinijkowe funkcje String.valueOf() i charAt(), ale odtwarza również nieaktualne porady z danych treningowych, takie jak przestarzały konstruktor new Character(c). Skompiluj każdą sugestię i przeczytaj ostrzeżenia o przestarzałych funkcjach.

Podsumuj ten post następująco: