Как преобразовать Char в строку Java (Примеры)

⚡ Умное резюме

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

  • 🔘 String.valueOf: Метод String.valueOf(myChar) возвращает строку из одного символа и наиболее четко выражает цель преобразования.
  • ☑️ Character.toString: Метод Character.toString(myChar) выполняет ту же работу, и поскольку Java 9. Просто делегирует вызов методу String.valueOf.
  • charAt: Метод charAt(index) возвращает символ, начинающийся с нуля, и генерирует исключение StringIndexOutOfBoundsException за пределами допустимого диапазона.
  • 🧪 Массивы символов: Метод toCharArray() разбивает строку на массив символов, а метод new String(chars) восстанавливает текст из этого массива.
  • 🇧🇷 Без кастинга: Строку невозможно преобразовать в тип char, поскольку строка — это объект, а не связанный с ним примитивный тип.
  • 📌 Ограничение на использование символов Юникода: Символ содержит одну 16-битную кодовую единицу UTF-16, поэтому для создания эмодзи требуется два символа или метод Character.toString(codePoint).

Java Код, преобразующий символ в строку и строку обратно в символ.

В этом уроке мы рассмотрим две короткие программы, которые перемещают значение между двумя способами. Java хранит текст:

  1. Преобразовать символ в строку
  2. Преобразовать строку в символ.

Эти два типа не взаимозаменяемы. Символ (char) — это примитив, содержащий ровно одну 16-битную кодовую единицу UTF-16, записывается в одинарные кавычки как 'g'. Строка (String) — это объект, содержащий последовательность таких кодовых единиц, записывается в двойные кавычки как "".Guru99”. Поскольку один из них является примитивом, а другой — объектом, приведение типов не может их связать — эту работу должен выполнить библиотечный метод, и Java по одному комплекту для каждого направления.

Преобразование символа в строку

Существует несколько способов преобразовать символ в строку. JavaВнутри a Java Строка хранит свой текст. В качестве массива кодовых единиц, именно поэтому один символ так легко вписывается в него. Символ — это 16-битный беззнаковый тип данных шириной в два байта, содержащий значения от 0 до 65 535.

Преобразовать символ в строку можно двумя способами: статическим методом toString() класса Character и статическим методом valueOf() класса String. Оба метода возвращают совершенно новую строку длиной в один символ, и обе приведенные ниже программы выводят одинаковый результат.

Способ 1: использование метода toString()

Приведенная ниже программа сохраняет букву g в a символьная переменная и передает его в метод 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

Другие способы преобразования символа в строку.

В более старом коде и в вопросах на собеседованиях встречаются еще четыре варианта. Все они работают, но ни один из них не читается так же понятно, как два описанных выше метода, и два из них выделяют больше памяти, чем необходимо.

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Сначала определите символ. Используйте Character.valueOf, а не новый конструктор Character(char), который был объявлен устаревшим и будет удален. Java 9.
массив символов new String(new char[]{myChar}) Выделяет массив и копирует его. Рекомендуется использовать этот метод только в том случае, если у вас уже есть символьный массив.
String.format String.format("%c", myChar) Самый медленный вариант, поскольку строка формата анализируется во время выполнения. Полезен только в том случае, если символ является частью более крупного шаблона.

После рассмотрения преобразования одного символа в обоих направлениях, переходим к обратной операции.

Преобразовать строку в символ

Мы можем преобразовать строку в символ, используя метод `charAt()` класса `String`. Этот метод принимает индекс, начинающийся с нуля, и возвращает символ, находящийся в этой позиции, поэтому чтение каждого символа означает... уборная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

Обратите внимание, что строку нельзя просто привести к нужному типу: `char c = (char) myStr;` не компилируется, потому что строка — это объект, а `char` — примитивный тип. Для строки, которая, как известно, содержит ровно один символ, `charAt(0)` — это полный ответ.

Преобразование строки в массив символов и обратно.

Когда все символы нужны одновременно, а не по одному индексу за раз, метод toCharArray() возвращает управление. новый массив символовПреобразование этого массива обратно в текст — задача конструктора String(char[]) или String.valueOf(char[]), и оба метода копируют массив в целях безопасности, чтобы последующие изменения массива не повлияли на строку.

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() Новый массив; безопасен при работе с пустой строкой, в этом случае возвращается массив нулевой длины.
преобразование массива символов в строку new String(chars) or String.valueOf(chars) Новая строка плюс внутренняя копия массива.
Вставить значение в существующий массив myStr.getChars(0, 4, part, 0) Ничего нового; программа записывает данные в предоставленный вами массив.

Распространенные ошибки при преобразовании символов в строки в Java

Большинство проблем при этих преобразованиях связано с шестью повторяющимися ошибками, а не с самими методами. В таблице каждая ошибка сопровождается способом её исправления.

Проблема Вызывать фиксированный
Несовместимые типы: строка не может быть преобразована в символ. Попытка приведения типа, например, char c = (char) myStr; Вместо этого вызовите myStr.charAt(0). Приведение типа между объектом и примитивным типом не происходит.
StringIndexOutOfBoundsException Функция charAt() вызывается с отрицательным индексом или функцией length() для пустой строки. Используйте функцию isEmpty() для защиты от чтения или сравните индекс с длиной (length()) перед чтением.
String.valueOf(null) throws NullPointerException Пустой символ соответствует перегрузке массива char[], которая является наиболее специфичной. Используйте String.valueOf((Object) null), если вам нужен именно текст null.
Character.toString(65) возвращает A, а не 65. Java В версии 11 добавлена ​​перегрузка метода Character.toString(int), которая считывает свой аргумент как кодовую точку Unicode. Для ввода цифры 65 используйте String.valueOf(65) или Integer.toString(65).
Эмодзи отображается в виде двух искаженных символов. Символы выше U+FFFF занимают два места: высокое суррогатное значение, за которым следует низкое суррогатное значение. Прочитайте значение с помощью codePointAt(0), затем перестройте его с помощью Character.toString(codePoint) on Java 11 и позже.
Предупреждение об устаревании функции при создании нового персонажа (myChar) Конструктор Character(char) устарел с момента его создания. Java 9 и отмечены для удаления Используйте Character.valueOf(myChar) или позвольте автоупаковке предоставить обертку.

Один и тот же класс String поддерживает множество смежных упражнений: переворачивание строки с помощью рекурсии, сравнение двух строк и печать отформатированного вывода.

Часто задаваемые вопросы (FAQ)

Символ (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 добавлена ​​перегрузка типа int, которая считывает свой аргумент как кодовую точку Unicode, а 65 — это кодовая точка для буквы A. String.valueOf(65) возвращает цифры 65, что легко может привести к путанице между этими двумя вызовами.

Добавьте его с помощью оператора сложения (плюс) или вызовите метод `append()` для `StringBuilder`, когда сложение происходит внутри цикла. Java Строка является неизменяемой, поэтому каждая конкатенация создает новый объект, а не расширяет старый.

Не с Java 9. В компактных строках внутренний массив символов был заменен массивом байтов плюс флагом кодировщика, поэтому чистый текст Latin-1 использует один байт на символ. В публичном API ничего не изменилось, и charAt() по-прежнему возвращает символ.

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

Второй пилот GitHub Надежно генерирует однострочные конструкции String.valueOf() и charAt(), но также воспроизводит устаревшие рекомендации из обучающих данных, такие как устаревший конструктор new Character(c). Компилируйте каждое предложение и читайте предупреждения об устаревании.

Подведем итог этой публикации следующим образом: