Как да конвертирате Char в String в Java (Примери)
⚡ Умно обобщение
Преобразуване на char в String в Java приема еднократно извикване на String.valueOf(myChar) или Character.toString(myChar). Движението в обратна посока използва charAt(index), който извлича един символ от String по неговата позиция.
В този урок ще разгледаме две кратки програми, които преместват стойност между двата начина Java съхранява текст:
- Преобразуване на символ в низ
- Преобразуване на низ в символ
Двата типа не са взаимозаменяеми. 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 поддържа множество съседни упражнения: обръщане на низ с рекурсия, сравняване на два низа, и отпечатване на форматиран изход.
