Replace String sem criar uma nova String

11 respostas
Jose111

Como dar um replace em uma String sem criar uma nova instancia da Classe String

11 Respostas

guilherme.dio

Como assim ???

n tem que criar nenhuma instancia:
Ex. remover espaços em branco:

String texto = "ESTE TEXTO POSSUI ESPAÇOS EM BRANCO    !   !";
texto = texto.replace("\\s","");
Jose111

Mas o metodo replace não ira te retornar uma nova instancia de String?

Sim eu sei que String é imutavel mas nao tem como contornar isto de alguma forma? Ex: outra classe que realize a mesma função…

guilherme.dio

Não estou entendendo o que vc quer…

Jose111

Pseudo-codigo para demonstrar:

String teste = "abc";  aqui eu tenho uma instancia de String

teste = teste.replace("b", "d"); aqui vou ter duas instancias de String porque o replace ira me retornar uma nova String

O que eu quero:

teste.replaceInstancia("b", "d"); assim trocariamos o caractere na mesma instancia.
ViniGodoy

Não tem como.
Strings são imutáveis.

O máximo que vc pode fazer é usar um StringBuilder no lugar:

StringBuilder sb = new StringBuilder(suaString); //Trabalhe sobre o stringBuilder suaString = sb.toString(); //O resultado volta para a String.

Jose111

Sad But True…

Tentei o seguinte workaround:

Transformo a String para um array de char, faço todos os repleces que necessito e somente no final recrio a String novamente…

So que implementar o replace de String é um pouquinho mais difícil do que imaginava…

juceliohv

e qual a finalidade de tal implementaçao?

ViniGodoy

Então usa o StringBuilder, como demonstrei.

Jose111

Vc tem um texto grande onde tem que trocar varias posições deste texto por informações vindas do banco ao dar um Replace nesse texto vc acaba criando muitas instâncias dele em memória que acabam estourando a memória da aplicação…

ViniGodoy

Se as instâncias forem descartadas, aí a memória não estoura.
Haverá garbage collection antes disso.

Um exemplo de operação onde a instância é discartada seria:

x = x.replace("a", "b"); //O antigo valor de x é descartado

Em todo caso, use o StringBuilder também por motivos de performance. Se você processa muito texto, ele representa uma cadeia de caracteres mutáveis.

Jose111

Verdade Vini, quando vc falou em algo estar segurando as referencias em memória me lembrei que no final o texto é adicionado em um ArrayList então la ele ficava com vários textos em memória…

Bom estou, mandando salvar em texto para ver se da certo…

Criado 7 de julho de 2011
Ultima resposta 8 de jul. de 2011
Respostas 11
Participantes 4