RESOLVIDO - classe StringBuffer

Bom mesmo com apenas 6 meses de logica e 4 de java da perceber que declarar uma string e nao poder mudar o valor dela cause limitação.
a apostila da caelum ja fala pra notar a StringBuffer justamente pq é mutavel.

legal fui la no main e declarei um o objeto ref StringBuffer e passei uma string
depois tentei alterar e o eclipese de cara ja sublinhou de vermelho

StringBuffer word = new StringBuffer("carro");

StringBuffer word = "red"; // ele sublinha a partir do word

entao nao entendi como assim “mutavel” ?

acho que vc entendeu errado , na verdade ela e imutavel ,
ou seja, nao se consegue mudar

Camarada, seu entendimento sobre o assunto está equivocado.

O que você passou na segunda linha (e ficou sublinhado em vermelho) não é uma instância de StringBuffer, e sim um literal String.
A IDE sublinhou porque são tipos incompatíveis. Não dá para passar um String direto para uma varíavel StringBuffer.

Strings em Java são naturalmente imutáveis. Observe o exemplo abaixo:

String a = "Olá";
a = "Mundo";

Apesar de termos apenas uma variável String declarada, na memória teremos dois objetos String: um “Olá” e outro “Mundo”.

Abraços.

Complementando: ele sublinhou a partir do Word pq vc declarou duas variáveis de mesmo nome.
Mude para word2 e veja o erro mudar para o que eu te passei.

[quote=andydelarge]acho que vc entendeu errado , na verdade ela e imutavel ,
ou seja, nao se consegue mudar[/quote]

mas que estranho
na pagina 173 da apostila j11 da caelum fala que StringBuffer é mutavel
:shock:

Sim uma String é imutável ,
esse seu exemplo ficaria melhor assim :

StringBuilder word = new StringBuilder(“Carro”);
word.append(“red”);
System.out.println(word);

e iria imprimir : Carrored

StringBuilder e usado para concatenar Strings , e possue um melhor desempenho
para textos por exemplo .

obrigado ai pessoal
mas oq ue sera que a apostila da caelum quer dizer entao qdo afirma que StringBuffer é mutavel ?

Significa que não é criado um outro objeto para cada concatenação de valores na String inicial.
Simplesmente o StringBuffer é alterado e quando quiser retornar uma String usa-se o método
toString() do StringBuilder.

Até mais

[quote=EAugusto]Significa que não é criado um outro objeto para cada concatenação de valores na String inicial.
Simplesmente o StringBuffer é alterado e quando quiser retornar uma String usa-se o método
toString() do StringBuilder.

Até mais[/quote]

desculpa incomodar cara mas tu poderia exemplificar isso numas linhas decodigo?
valeu

[quote=rafaelczy][quote=EAugusto]Significa que não é criado um outro objeto para cada concatenação de valores na String inicial.
Simplesmente o StringBuffer é alterado e quando quiser retornar uma String usa-se o método
toString() do StringBuilder.

Até mais[/quote]

desculpa incomodar cara mas tu poderia exemplificar isso numas linhas decodigo?
valeu[/quote]

Sim Rafael, a classe StringBuffer é mutavél pelo fato de possuir métodos que alterem seu conteúdo, podendo perder referência ao que já existia. Quando você ussa o método append(), que aceita vários tipos incluindo Object, você não cria um novo objeto mas sim utiliza do já existe e altera seu conteúdo. Inclusive, pode simplesmente usar o método delete para “apagar” todo o conteúdo do seu objeto StringBuffer.

Todavia, a classe String é um exemplo de classe imutavél, já que o seu contéudo não pode ser alterado uma vez criado. Você dispõe de vários métodos de manipulação, como o toUpperCase(), no qual faz com que o conteúdo da String passe a ser todo em maíusculo. Se verificar na assinatura do método, verás que retorna uma nova String e não é void. Isso porque, a String que você passar como parametro permanecerá inalterada.

Veja exemplo em código com ambos.

[code]StringBuffer sb = new StringBuffer();
sb.append("Ola ");

System.out.println("Inicio: " + sb.toString());

sb.append(“Mundo”);

System.out.println("Fim: " + sb.toString());[/code]

É exatamente o mesmo objeto e ele está me retornando valores distintos em dado um determinado momento. Resumidamente, eu pude modificar seu conteúdo.
Agora, com String:

[code]String s = “ola mundo”;
s.toUpperCase();
System.out.println("Origem: " + s);

String maiusculo = s.toUpperCase();
System.out.println("Nova String: " + maiusculo);[/code]

Nessa caso ‘s’ será impresso assim como foi declarado, porque String é imutavél, para que eu pudesse ter o seu conteúdo modificado, tive de atribuir o resultado do método toUpperCase() a outra String, conforme demonstrei.

Espero ter ajudado.

Abraços!

Olá nel
agora tu esclareu melhor q ninguem
realmente claro
really thanks a lot men!!! :stuck_out_tongue: