Як перетворити Char на String в Java (Приклади)

⚡ Розумний підсумок

Перетворення char у рядок у Java приймає один виклик String.valueOf(myChar) або Character.toString(myChar). Рух у зворотному напрямку використовує charAt(index), який витягує один символ з рядка за його позицією.

  • 🔘 String.valueOf: String.valueOf(myChar) повертає односимвольний рядок та найчіткіше визначає мету перетворення.
  • ☑️ Символ.вРядок: Character.toString(myChar) виконує ту саму роботу, і оскільки Java 9, просто делегує String.valueOf.
  • ✅ charAt: charAt(index) повертає значення char у позиції, що починається з нуля, та викидає StringIndexOutOfBoundsException поза межами допустимого діапазону.
  • 🧪 масиви символів: toCharArray() розділяє рядок String на масив символів, а new String(chars) перебудовує текст з цього масиву.
  • 🛠️ Без кастингу: Рядок ніколи не можна перетворити на символ char, оскільки рядок є об'єктом, а не пов'язаним з ним примітивним типом.
  • 📌 Обмеження Unicode: Символ містить одну 16-бітну одиницю коду UTF-16, тому емодзі потрібно два символи або Character.toString(codePoint).

Java код, що перетворює char на String та String назад на char

У цьому посібнику ми вивчимо дві короткі програми, які переміщують значення між двома способами Java текст магазинів:

  1. Перетворити символ на рядок
  2. Перетворити рядок на символ

Ці два типи не є взаємозамінними. Char — це примітив, який містить рівно одну 16-бітну одиницю коду UTF-16, записану в одинарних лапках як 'g'. String — це об'єкт, який містить послідовність цих одиниць коду, записану в подвійних лапках як “Guru99”. Оскільки один є примітивом, а інший — об’єктом, жодне приведення типів не може їх об’єднати — цю роботу має виконати бібліотечний метод, і Java постачає по одному для кожного напрямку.

Перетворити символ у рядок

Існує кілька способів перетворити char на String у JavaВнутрішньо a Java Рядок зберігає свій текст як масив одиниць коду, тому один тип char так легко вписується в один. Тип char — це 16-бітний беззнаковий тип даних шириною два байти, що містить значення від 0 до 65 535.

Ми можемо перетворити тип char на рядок (String) за допомогою двох методів — статичного методу toString() класу Character та статичного методу valueOf() класу String. Обидва повертають новий тип String довжиною один символ, а дві програми нижче виводять однаковий результат.

Спосіб 1: використання методу toString().

Наведена нижче програма зберігає літеру g у змінна char і передає його до Character.toString(), яка повертає цей окремий символ як рядок. Код можна редагувати, тому змініть літеру та запустіть його ще раз, щоб побачити, як відобразиться результат.

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

Очікуваний результат:

String is: g

Спосіб 2: використання методу valueOf().

Друга програма замінює String.valueOf(myChar) і більше нічого не змінює. Оскільки Java 9 два виклики є однією й тією ж операцією: Character.toString(char) реалізовано як виклик String.valueOf(char), тому жоден з них не є помітно швидшим за інший.

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

Очікуваний результат:

String is: g

Інші способи перетворення символу char у рядок

Ще чотири маршрути з'являються у старішому коді та у питаннях на співбесіді. Усі вони працюють, але жоден з них не читається так просто, як два вищезгадані методи, а два з них виділяють більше місця, ніж потрібно.

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

Очікуваний результат:

gggg

У таблиці зазначено, коли варто використовувати кожен маршрут.

Метод Приклад примітки
String.valueOf(char) String.valueOf(myChar) Рекомендовано. Один виклик, жодного додаткового об'єкта окрім повернутого рядка.
Character.toString(char) Character.toString(myChar) Так само добре. Доступно з Java 1.4 та делегує String.valueOf з моменту Java 9.
Сполучення myChar + “” Працює, і далі Java У версіях 9 та пізніших він компілюється у виклик invokedynamic, а не StringBuilder, тому старе попередження про його повільність більше не актуальне. Він все ще приховує намір.
Обгортка символів Character.valueOf(myChar).toString() BoxСпочатку використовується char. Використовуйте Character.valueOf, а не новий конструктор Character(char), видалення якого застаріло з . Java 9.
масив символів новий рядок(новий символ[]{myChar}) Виділяє пам'ять масиву та копіює його. Резервує це для випадку, якщо у вас вже є масив char.
String.format String.format(“%c”, myChar) Найповільніший, оскільки рядок форматування аналізується під час виконання. Корисно лише тоді, коли символ є частиною більшого шаблону.

Після того, як обидва напрямки односимвольного перетворення розглянуто, наступним кроком є ​​зворотна операція.

Перетворення рядка на char

Ми можемо перетворити рядок (String) на символ (char) за допомогою методу charAt() класу String. Метод приймає індекс, що починається з нуля, і повертає символ char, що знаходиться на цій позиції, тому зчитування кожного символу означає вбиральняping від 0 до length() мінус один. Запит індексу нижче 0 або на рівні length() і вище викликає виняток StringIndexOutOfBoundsException.

Програма нижче обходить рядок Guru99 по одній позиції за раз та друкує кожен символ з його індексом.

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

Очікуваний результат:

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

Зверніть увагу, що рядок String не можна просто привести: char c = (char) myStr; не компілюється, оскільки рядок String є об'єктом, а char є примітивом. Для рядка, про який вже відомо, що він містить рівно один символ, charAt(0) є повною відповіддю.

Перетворення рядка в масив символів і назад

Коли потрібен кожен символ одночасно, а не один індекс за раз, toCharArray() повертає функцію назад свіжий масив символівПеретворення цього масиву назад у текст є завданням конструктора String(char[]) або String.valueOf(char[]), і обидва копіюють масив захисно, тому подальші редагування масиву не змінюють 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));
  }
}

Очікуваний результат:

6
G
Guru99
Guru99
Guru

Четвертий метод, getChars(srcBegin, srcEnd, dst, dstBegin), копіює діапазон у масив, який у вас вже є, замість того, щоб виділяти новий. Кінцевий індекс є ексклюзивним, тому getChars(0, 4, part, 0) повертає Guru а не Guru9. Вихід за межі діапазону викликає виняток IndexOutOfBoundsException.

Ці три підходи відрізняються головним чином тим, що вони розподіляють, як узагальнено нижче.

Завдання виклик Що воно виділяє
Рядок у масив символів myStr.toCharArray() Новий масив; безпечний для порожнього рядка, де повертає масив нульової довжини.
масив символів у рядок новий String(chars) або String.valueOf(chars) Новий рядок (String) плюс внутрішня копія масиву.
Діапазон у існуючий масив myStr.getChars(0, 4, частина, 0) Нічого нового; він записує дані в масив, який ви надаєте.

Типові помилки під час конвертації char та String у Java

Більшість проблем із цими перетвореннями виникає через шість повторюваних помилок, а не через самі методи. У таблиці кожна з них поєднана з виправленням.

Проблема Викликати виправляти
несумісні типи: рядок не можна перетворити на символ char Спроба приведення типів, наприклад, char c = (char) myStr; Натомість викличте myStr.charAt(0). Немає приведення типів між об'єктом та примітивом.
Виняток StringIndexOutOfBoundsException charAt() викликається з від'ємним індексом або з length() для порожнього рядка Захищайте за допомогою isEmpty() або порівнюйте індекс з length() перед читанням.
String.valueOf(null) викликає виняток NullPointerException Голе значення null відповідає перевантаженню char[], яке є найбільш специфічним Напишіть String.valueOf((Object) null), коли вам потрібен літерал null.
Character.toString(65) повертає A, а не 65 Java У версії 11 додано перевантаження Character.toString(int), яке зчитує свій аргумент як кодову точку Unicode. Використовуйте String.valueOf(65) або Integer.toString(65) для цифр 65.
Емоджі друкується як два спотворені символи Символи вище U+FFFF займають два символи: старший сурогат, а потім молодший сурогат. Зчитайте значення за допомогою codePointAt(0), а потім перебудуйте його за допомогою Character.toString(codePoint) Java 11 і пізніше.
Попередження про застарівання нового персонажа (myChar) Конструктор Character(char) застарів з Java 9 та позначено для видалення Використовуйте Character.valueOf(myChar) або дозвольте autoboxing забезпечити обгортку.

Той самий клас String підтримує безліч суміжних вправ: зворотне перетворення рядка за допомогою рекурсії, порівняння двох рядків та друк відформатованого виводу.

Поширені запитання

Char — це примітив, що містить одну 16-бітну одиницю коду UTF-16, записану в одинарних лапках. String — це об'єкт, що містить послідовність цих одиниць, записану в подвійних лапках, і він містить такі методи, як length() та charAt(), які примітив не може використовувати.

Ні. Оскільки Java 9, Character.toString(char) реалізовано як виклик String.valueOf(char), тому обидва виконують один і той самий код. Оберіть той, який краще читається там, де ви працюєте; String.format(“%c”, c) – єдиний маршрут, який справді повільний.

Символ зберігає одну 16-бітну одиницю коду, а емодзі розташовується над U+FFFF. Java розділяє їх на сурогатну пару, щоб вони займали два символи. Зчитайте кодову точку за допомогою codePointAt() та перебудуйте текст за допомогою Character.toChars() або Character.toString(codePoint).

Струна А. Java У версії 11 додано перевантаження цілочисельного типу, яке зчитує свій аргумент як кодову точку Unicode, а 65 є кодовою точкою для A. String.valueOf(65) повертає замість цього цифри 65, що робить ці два виклики легко сплутаними.

Об'єднайте його за допомогою оператора плюс або викличте append() у StringBuilder, коли додавання відбувається всередині циклу. Java Рядок є незмінним, тому кожне об'єднання виділяє новий об'єкт, а не розширює старий.

Не з тих пір Java 9. Компактні рядки замінили внутрішній масив символів на масив байтів плюс прапорець кодера, тому чистий текст Latin-1 використовує один байт на символ. У публічному API нічого не змінилося, і charAt() все ще повертає символ char.

Статичні аналізатори з машинним навчанням позначають підозрілі перетворення, які приймає компілятор, такі як незахищений виклик charAt() або String.valueOf(null), який перетворюється на перевантажений масив char. Вони ранжують результати за ймовірністю, що зменшує шум простого сканування на основі правил.

Копілот GitHub надійно створює однорядкові оператори String.valueOf() та charAt(), але також відтворює застарілі поради зі своїх навчальних даних, такі як застарілий конструктор new Character(c). Скомпілюйте кожну пропозицію та прочитайте попередження про застаріле використання.

Підсумуйте цей пост за допомогою: