1. Introducción
En este tutorial rápido, demostraremos cómo agregar un carácter en cualquier posición dada en una cadena en Java .
Presentaremos tres implementaciones de una función simple que toma el String original , un carácter y la posición donde necesitamos agregarlo.
Dado que la clase String es final e inmutable, la función debería devolver una nueva String con el carácter agregado.
2. Usando una matriz de caracteres
Aquí, la idea es crear una nueva matriz de caracteres y copiar los caracteres de la Cadena original antes de la posición dada.
Después de eso, colocamos el nuevo carácter en la posición y copiamos el resto de los caracteres de la Cadena original en las posiciones posteriores de la nueva matriz.
Finalmente, construimos la cadena deseada a partir de esa matriz.
public String addChar(String str, char ch, int position) { int len = str.length(); char[] updatedArr = new char[len + 1]; str.getChars(0, position, updatedArr, 0); updatedArr[position] = ch; str.getChars(position, len, updatedArr, position + 1); return new String(updatedArr); }
En comparación con los otros dos métodos, este es un enfoque de diseño de bajo nivel y nos brinda la mayor flexibilidad.
3. Usando el método de subcadena
Un enfoque más fácil y de mayor nivel es usar el método substring () de la clase String . Prepara el String concatenando:
- La subcadena de la cadena original antes de la posición
- El nuevo personaje
- La subcadena de la cadena original después de la posición
public String addChar(String str, char ch, int position) { return str.substring(0, position) + ch + str.substring(position); }
Aunque el código anterior es más legible, tiene el inconveniente de que crea una serie de objetos temporales para determinar el resultado. Como String es una clase inmutable, cada llamada a su método substring () crea una nueva instancia de String .
Finalmente, cuando concatenamos las partes, el compilador crea un objeto StringBuilder para agregarlas una por una. Cada objeto String y StringBuilder asigna ubicaciones de memoria separadas para su matriz de caracteres internos.
Esta implementación también necesita copiar todos los caracteres tres veces de una matriz a otra.
Si necesitamos llamar al método una gran cantidad de veces, los objetos temporales pueden llenar la memoria del montón y eso activará GC con mucha frecuencia. Esto también puede afectar el rendimiento hasta cierto punto.
4. Usando un StringBuilder
StringBuilder es una clase de utilidad proporcionada por la biblioteca Java para construir y manipular objetos String de varias formas.
Podemos implementar la misma funcionalidad usando el método insert () de la clase StringBuilder :
public String addChar(String str, char ch, int position) { StringBuilder sb = new StringBuilder(str); sb.insert(position, ch); return sb.toString(); }
El código anterior necesita crear solo un objeto StringBuilder para insertar el carácter en la posición. Asigna la misma cantidad de memoria que tiene el String original , pero para crear un lugar para el nuevo carácter, la matriz subyacente desplaza los siguientes caracteres en 1 posición.
Aunque el uso de StringBuilder puede ser más lento, no tiene la carga de memoria de inicializar objetos temporales. También terminamos con un código que es simple y legible.
5. Conclusión
En este artículo, nos enfocamos en varias formas de agregar un carácter en un objeto String en Java . Hemos visto que la implementación que usa una matriz de caracteres ofrece el mejor rendimiento y que con el método de subcadena brinda un enfoque más legible.
La forma preferida de implementar la solución es utilizando la clase StringBuilder , ya que es simple, menos propensa a errores y ofrece un rendimiento bueno y estable .
Como de costumbre, el código fuente completo para el tutorial anterior está disponible en GitHub.