Как да конвертирате Char в String в Java (Примери)

⚡ Умно обобщение

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

  • 🔘 String.valueOf: String.valueOf(myChar) връща едносимволен String и посочва най-ясно целта на преобразуването.
  • ☑️ Символ.къмНиз: Character.toString(myChar) върши същата работа и, тъй като Java 9, просто делегира на String.valueOf.
  • ✅ charAt: charAt(index) връща char на позиция, базирана на нула, и хвърля StringIndexOutOfBoundsException извън валидния диапазон.
  • 🧪 масиви от символи: toCharArray() разделя String на масив от тип char, а 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 в низ

Има няколко начина за преобразуване на char в String в JavaВътрешно a Java Низът съхранява текста си като масив от кодови единици, поради което един char се вписва толкова лесно в един. Char е 16-битов беззнаков тип данни, широк два байта, съдържащ стойности от 0 до 65 535.

Можем да конвертираме char в String, използвайки 2 метода - статичния метод toString() на класа Character и статичния метод valueOf() на класа String. И двата метода връщат чисто нов String с дължина един символ, а двете програми по-долу отпечатват един и същ резултат.

Метод 1: Използване на метода toString().

Програмата по-долу съхранява буквата g в char променлива и го предава на Character.toString(), който връща този единичен символ като String. Кодът е редактируем, така че променете буквата и го изпълнете отново, за да видите как ще се получи резултатът.

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 в String

Четири допълнителни маршрута се появяват в по-стар код и във въпроси за интервюта. Всички те работят, но никой от тях не се чете толкова ясно, колкото двата метода по-горе, а два от тях разпределят повече, отколкото е необходимо.

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.
наниз моят символ + „“ Работи и продължава 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 е примитив. За String, за който вече е известно, че съдържа точно един символ, charAt(0) е целият отговор.

Преобразуване на низ в масив от тип char и обратно

Когато е необходим всеки символ наведнъж, а не един индекс наведнъж, 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.

Трите подхода се различават главно по това какво разпределят, както е обобщено по-долу.

Task ПОЗВЪНЯВАНЕ Какво разпределя
Низ в масив от символи myStr.toCharArray() Нов масив; безопасен за празен низ, където връща масив с нулева дължина.
масив от символи към низ нов String(chars) или String.valueOf(chars) Нов низ плюс вътрешно копие на масива.
Диапазон в съществуващ масив myStr.getChars(0, 4, част, 0) Нищо ново; записва в масива, който предоставяте.

Често срещани грешки при конвертиране на char и String в Java

Повечето проблеми при тези преобразувания идват от шест повтарящи се грешки, а не от самите методи. Таблицата съпоставя всяка от тях с решението.

Проблем Причина Фиксирайте
несъвместими типове: String не може да бъде преобразуван в 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) е единственият маршрут, който е наистина бавен.

Един символ (char) съхранява една 16-битова кодова единица, а емотиконите се намират над U+FFFF. Java разделя ги на сурогатна двойка, така че да заемат два символа. Прочетете кодовата точка с codePointAt() и възстановете текста с Character.toChars() или Character.toString(codePoint).

Струната А. Java В версия 11 е добавено претоварване на int, което чете аргумента си като Unicode кодова точка, а 65 е кодовата точка за A. String.valueOf(65) връща цифрите 65 вместо това, което прави двете извиквания лесни за объркване.

Свържете го с оператора plus или извикайте append() на StringBuilder, когато добавянето се извършва в цикъл. Java Низът е непроменлив, така че всяко конкатениране разпределя нов обект, вместо да разширява стария.

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

Статичните анализатори с машинно обучение сигнализират за подозрителни реализации, които компилаторът приема, като например неохранявано извикване на charAt() или String.valueOf(null), което се преобразува в претоварен масив от char. Те класират откритията по вероятност, което намалява шума от обикновено сканиране, базирано на правила.

Копилот на GitHub надеждно генерира едноредови изречения в String.valueOf() и charAt(), но също така възпроизвежда остарели съвети от своите обучителни данни, като например остарелия нов конструктор Character(c). Компилирайте всяко предложение и прочетете предупрежденията за остаряване.

Обобщете тази публикация с: