Cómo convertir caracteres en cadenas en Java (Ejemplos)
⚡ Resumen inteligente
Convertir un carácter a una cadena en Java Se realiza una sola llamada a String.valueOf(myChar) o Character.toString(myChar). Para el movimiento inverso se utiliza charAt(index), que extrae un carácter de una cadena según su posición.
En este tutorial, estudiaremos dos programas cortos que mueven un valor entre dos caminos. Java Almacena texto:
- Convierte un carácter en una cadena.
- Convierte una cadena de texto en un carácter.
Los dos tipos no son intercambiables. Un char es un tipo primitivo que contiene exactamente una unidad de código UTF-16 de 16 bits, escrita entre comillas simples como 'g'. Una cadena es un objeto que contiene una secuencia de esas unidades de código, escrita entre comillas dobles como “Guru99”. Debido a que uno es un tipo primitivo y el otro un objeto, ninguna conversión puede unirlos: un método de la biblioteca tiene que hacer el trabajo, y Java Proporciona uno para cada dirección.
Convertir caracteres en cadenas
Hay varias formas de convertir un carácter a una cadena en JavaInternamente a Java String almacena su texto como una matriz de unidades de código, razón por la cual un solo char encaja tan fácilmente en una. Un char es un tipo de dato sin signo de 16 bits, de dos bytes de ancho, que almacena valores de 0 a 65,535.
Podemos convertir un carácter a una cadena usando dos métodos: el método estático toString() de la clase Character y el método estático valueOf() de la clase String. Ambos devuelven una cadena nueva de un carácter de longitud, y los dos programas que se muestran a continuación imprimen el mismo resultado.
Método 1: usar el método toString()
El programa a continuación almacena la letra g en una variable de caracteres y lo pasa a Character.toString(), que devuelve ese carácter como una cadena de texto. El código es editable, así que cambia la letra y ejecútalo de nuevo para ver el resultado.
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);
}
}
Rendimiento esperado :
String is: g
Método 2: usar el método valueOf()
El segundo programa intercambia String.valueOf(myChar) y no cambia nada más. Dado que Java 9 Las dos llamadas son la misma operación: Character.toString(char) se implementa como una llamada a String.valueOf(char), por lo que ninguna es notablemente más rápida que la otra.
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);
}
}
Rendimiento esperado :
String is: g
Otras formas de convertir un carácter en una cadena
En el código antiguo y en las preguntas de las entrevistas aparecen otras cuatro rutas. Todas funcionan, pero ninguna es tan clara como los dos métodos anteriores, y dos de ellas asignan más recursos de los necesarios.
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); } }
Rendimiento esperado:
gggg
La tabla detalla cuándo merece la pena utilizar cada ruta.
| Método | Ejemplo | Notas |
|---|---|---|
| Cadena.valorDe(carácter) | Cadena.valorDe(miCarácter) | Recomendado. Una sola llamada, sin objetos adicionales más allá de la cadena devuelta. |
| Carácter.toString(carácter) | Carácter.toString(myChar) | Igualmente bueno. Disponible desde Java 1.4 y delega a String.valueOf desde Java 9. |
| Concatenación | miPersonaje + “” | Obras y en Java En versiones posteriores, se compila a una llamada invokedynamic en lugar de a un StringBuilder, por lo que la antigua advertencia de que es lento ya no es válida. Aun así, oculta la intención. |
| Envoltorio de personaje | Carácter.valorDe(miCarácter).aCadena() | Boxes el carácter primero. Use Character.valueOf, no el nuevo constructor Character(char), que ha sido obsoleto para su eliminación desde Java 9. |
| matriz de caracteres | nueva cadena(nuevo carácter[]{myChar}) | Asigna memoria a un array y lo copia. Resérvelo para el caso en que ya tenga un array de caracteres. |
| Cadena.formato | String.format("%c", myChar) | Es, con diferencia, el método más lento, ya que la cadena de formato se analiza en tiempo de ejecución. Solo resulta útil cuando el carácter forma parte de una plantilla más amplia. |
Una vez cubiertas ambas direcciones de la conversión de un solo carácter, el siguiente paso es la operación inversa.
Convertir cadena a carácter
Podemos convertir una cadena a carácter usando el método charAt() de la clase String. El método toma un índice basado en cero y devuelve el carácter que se encuentra en esa posición, por lo que leer cada carácter significa lavaboping desde 0 hasta length() menos uno. Solicitar un índice menor que 0 o igual o superior a length() genera una excepción StringIndexOutOfBoundsException.
El programa que se muestra a continuación recorre la cadena Guru99 una posición a la vez e imprime cada carácter con su índice.
//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);
}
}
}
Rendimiento esperado:
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
Tenga en cuenta que una cadena no se puede convertir simplemente: `char c = (char) myStr;` no compila, porque una cadena es un objeto y `char` es un tipo primitivo. Para una cadena que se sabe que contiene exactamente un carácter, `charAt(0)` es la solución completa.
Convierte una cadena de caracteres en un array de caracteres y viceversa.
Cuando se necesita cada carácter a la vez en lugar de un índice a la vez, toCharArray() devuelve una parrillada fresca. Convertir ese array de nuevo en texto es tarea del constructor String(char[]) o String.valueOf(char[]), y ambos copian el array de forma segura, de modo que las ediciones posteriores del array no alteren la cadena.
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)); } }
Rendimiento esperado:
6 G Guru99 Guru99 Guru
Un cuarto método, getChars(srcBegin, srcEnd, dst, dstBegin), copia un rango en una matriz que ya posees en lugar de asignar una nueva. El índice final es exclusivo, por lo que getChars(0, 4, part, 0) produce Guru más bien que Guru9. Los límites fuera de rango generan una excepción IndexOutOfBoundsException.
Los tres enfoques difieren principalmente en lo que asignan, como se resume a continuación.
| Task | Llame hoy al | Lo que asigna |
|---|---|---|
| Cadena a matriz de caracteres | miStr.toCharArray() | Un nuevo array; seguro en una cadena vacía, donde devuelve un array de longitud cero. |
| matriz de caracteres a cadena | nueva cadena(caracteres) o cadena.valorDe(caracteres) | Una nueva cadena de texto más una copia interna del array. |
| Rango en una matriz existente | myStr.getChars(0, 4, parte, 0) | Nada nuevo; escribe en el array que le proporciones. |
Errores comunes al convertir char y String en Java
La mayoría de los problemas en estas conversiones provienen de seis errores recurrentes, más que de los métodos en sí. La tabla relaciona cada error con su solución.
| Primaria | Causa | Solución |
|---|---|---|
| Tipos incompatibles: String no se puede convertir a char. | Un intento de conversión, como por ejemplo char c = (char) myStr; | En su lugar, llama a myStr.charAt(0). No existe conversión entre un objeto y un tipo primitivo. |
| StringIndexOutOfBoundsException | charAt() llamado con un índice negativo, o con length() en una cadena vacía. | Protéjase con isEmpty() o compare el índice con length() antes de leer. |
| String.valueOf(null) lanza NullPointerException | El nulo simple coincide con la sobrecarga char[], que es la más específica. | Escribe String.valueOf((Object) null) cuando el texto literal null sea lo que deseas. |
| Character.toString(65) devuelve A, no 65. | Java 11 agregó una sobrecarga de Character.toString(int) que lee su argumento como un punto de código Unicode. | Utilice String.valueOf(65) o Integer.toString(65) para los dígitos 65. |
| Un emoji se imprime como dos símbolos distorsionados. | Los caracteres superiores a U+FFFF ocupan dos caracteres, un sustituto alto seguido de un sustituto bajo. | Lee el valor con codePointAt(0), luego reconstruyelo con Character.toString(codePoint) en Java 11 y posteriores. |
| Advertencia de obsolescencia en el nuevo Character(myChar) | El constructor Character(char) ha sido descontinuado desde Java 9 y marcado para su remoción | Utilice Character.valueOf(myChar), o deje que el autoboxing proporcione el contenedor. |
La misma clase String admite muchos ejercicios relacionados: Invertir una cadena con recursión, Comparando dos cadenas, y salida formateada de impresión.
