Adicionar um caractere a uma string em uma determinada posição
1. Introdução
Neste tutorial rápido, vamosdemonstrate how to add a character at any given position in a String in Java.
Apresentaremos três implementações de uma função simples que leva oString, original a um caractere e a posição onde precisamos adicioná-lo.
Como a classe String éfinal and immutable, a função deve retornar um novoString com o caractere adicionado.
2. Usando um caractereArray
Aqui, a ideia é criar um novo array de caracteres e copiar os caracteres doString original antes da posição dada.
Depois disso, colocamos o novo caractere na posição e copiamos o restante dos caracteres doString original nas posições subsequentes do novo array.
Finalmente, construímos oString desejado a partir desse array.
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);
}
Comparado aos outros dois métodos, essa é uma abordagem de design de baixo nível e nos oferece a maior flexibilidade.
3. Usando o métodosubstring
Uma abordagem mais fácil e de nível superior é usar o métodosubstring() da classeString. Ele preparaString concatenando:
-
A substring doString original antes da posição
-
O novo personagem
-
A substring doString original após a posição
public String addChar(String str, char ch, int position) {
return str.substring(0, position) + ch + str.substring(position);
}
Embora o código acima seja mais legível,it has a downside in that it creates a number of temporary objects to determine the result. ComoString é uma classe imutável, cada chamada para seu métodosubstring() cria uma nova instânciaString.
Finalmente, quando concatenamos as partes, o compilador cria um objetoStringBuilder para anexá-las uma por uma. Cada objetoStringeStringBuilder aloca locais de memória separados para sua matriz de caracteres interna.
Essa implementação também precisa copiar todos os caracteres três vezes de uma matriz para outra.
Se precisarmos chamar o método várias vezes, os objetos temporários podem preencher a memória heap e isso acionará o GC com muita frequência. Isso também pode afetar o desempenho até certo ponto.
4. Usando umStringBuilder
StringBuilder é uma classe de utilitário fornecida pela bibliotecaJava para construir e manipular objetosString de várias maneiras.
Podemos implementar a mesma funcionalidade usando o métodoinsert() da classeStringBuilder:
public String addChar(String str, char ch, int position) {
StringBuilder sb = new StringBuilder(str);
sb.insert(position, ch);
return sb.toString();
}
O código acima precisa criar apenas um único objetoStringBuilder para inserir o caractere na posição. Ele aloca a mesma quantidade de memória que oString original tem, mas para criar um lugar para o novo caractere, a matriz subjacente muda os próximos caracteres em 1 posição.
Embora o uso de umStringBuilder possa ser mais lento, ele não tem a carga de memória de inicializar objetos temporários. We also end up with code that is simple and readable.
5. Conclusão
Neste artigo, nos concentramos em várias maneiras de adicionar um caractere em um objetoString emJava. Vimos que a implementação usando uma matriz de caracteres oferece o melhor desempenho e que com o métodosubstring oferece uma abordagem mais legível.
A forma preferida de implementar a solução é usandothe StringBuilder class – as it’s simple, less bug-prone and offers good and stable performance.
Como de costume, o código-fonte completo do tutorial acima está disponívelover on GitHub.