String é Imutavel? What? OCA EXAM BOOK - Duvida

Ola Gente.
Aqui no livro da OCJA/OCA
Esta escrito mais ou menos assim :

“An Object of the StringBuilder class represents a mutable character String…”
Mas antes ele fala que String é imutável.

Mas eu posso muito bem fazer isso :

String x = “Andre L”;
x = x.replaceAll(“L”,"?");

O que ele quer dizer com String imutavel e mutavel?

Toda String em java é imutável ela nasce com um tamanho e morre com ele isso é fato

o que acontece que quando você faz qualquer operação entre Strings, não importa qual seja (subString, StringA + StringB, conctenação, append) o que for o que o java faz é criar uma nova String em cima da String antiga

exemplo :

String a = "ola";
String b = "Mundo";
a = a + b;

nesse exemplo de cima a String “ola” original morre ela vai deixar de existir, e no lugar dela vira a String “olaMundo” substituindo o seu lugar

tenha muito cuidado ao fazer operações com String em java isso pode deixar a sua aplicação muito lento, eu lembro que uma vez fiz um programa que demorava 10 min para rodar o motivo dessa demora era por causa das inúmeras concatenações que minha String fazia.

Já ao usar o StringBuilder ele é uma String que o tamanho pode variar, assim concatenar Strings com ele não é um processo pesado, para você ter ideia essa minha aplicação que levava 10 min para rodar ao usar StringBuilder ela passou a levar 30 segundos

so usando o seu exemplo :

String x = "Andre L";
x = x.replaceAll("L","?");

quando você faz “x.replaceAll(“L”,”?");" você está gerando uma nova String diferente da original também e substituindo

[quote=Victor Gerin]Toda String em java é imutável ela nasce com um tamanho e morre com ele isso é fato

o que acontece que quando você faz qualquer operação entre Strings, não importa qual seja (subString, StringA + StringB, conctenação, append) o que for o que o java faz é criar uma nova String em cima da String antiga

exemplo :

String a = "ola";
String b = "Mundo";
a = a + b;

nesse exemplo de cima a String “ola” original morre ela vai deixar de existir, e no lugar dela vira a String “olaMundo” substituindo o seu lugar

tenha muito cuidado ao fazer operações com String em java isso pode deixar a sua aplicação muito lento, eu lembro que uma vez fiz um programa que demorava 10 min para rodar o motivo dessa demora era por causa das inúmeras concatenações que minha String fazia.

Já ao usar o StringBuilder ele é uma String que o tamanho pode variar, assim concatenar Strings com ele não é um processo pesado, para você ter ideia essa minha aplicação que levava 10 min para rodar ao usar StringBuilder ela passou a levar 30 segundos[/quote]

Ah!!! Saquei! Muito Obrigado…
Entao StringBuilder é mais rapido do que concatenar com + ?

[quote=Andre Lopes]

Ah!!! Saquei! Muito Obrigado…
Entao StringBuilder é mais rapido do que concatenar com + ? [/quote]

putz cada você não faz ideia de como mais rápido é, chega a ser absurdo a velocidade dele, claro que digo isso comparado a String normal

faça o seguinte teste

        String a = "a";
        for (int i = 0; i < 10_000_000; i++) {
            a += "a";
        }

ao executar esse teste meu pc praticamente travou

agora execute esse

        StringBuilder a = new StringBuilder("a");
        for (int i = 0; i < 10_000_000; i++) {
            a.append("a");
        }

a diferença é visível, nem precisa cronometrar

Aproposito não esqueça de colocar “[Resolvido]” alem também que tags como “[Duvida]” não é necessário ao posta aqui já sub entende-se que você tem uma dúvida xD

[quote=Victor Gerin]Toda String em java é imutável ela nasce com um tamanho e morre com ele isso é fato

o que acontece que quando você faz qualquer operação entre Strings, não importa qual seja (subString, StringA + StringB, conctenação, append) o que for o que o java faz é criar uma nova String em cima da String antiga

exemplo :

String a = "ola";
String b = "Mundo";
a = a + b;

nesse exemplo de cima a String “ola” original morre ela vai deixar de existir, e no lugar dela vira a String “olaMundo” substituindo o seu lugar
[/quote]
Não exatamente.
Os objetos continuam existindo até que o GarbageCollector faça seu trabalho. Isso pode ser no exato instante posterior à perda de referência (quando a + b é atribuído ao objeto a) ou após algum tempo.
É por isso que temos que ter cuidado com a manipulação de Strings em java.
Por outro lado, você pode usar String, concatenando com o operador ‘+’ sem problemas, só precisa ver se a quantidade de concatenações não é muito grande. Caso seja, prefira utilizar StringBuilder.

Muito bom o StringBuilder! Realizei uns testes e é muito superior! String “normal” deu erro ou dava uma travada enorme nos testes, já o StringBuilder mostrou uma eficiência incrível!