StringBuffer

Pessoal,

Para concatenar String o Java cria um novo objeto com o valor antigo + o valor novo. certo? Com o StringBuffer é feito a mesma coisa?

Grato pela atenção

Cara olha aqui o método sobrecarregado append() que tá na documentação

  // Documentation in subclasses because of synchro difference
    public AbstractStringBuilder append(StringBuffer sb) {
	if (sb == null)
            return append("null");
	int len = sb.length();
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
	sb.getChars(0, len, value, count);
	count = newCount;
	return this;
    }

vei ai ehehehe!!è bem legal!!

Não de tou 100% de certeza mas como é recomendado usar o StringBuffer quando necessário concatenar vários Strings, eu acho que ele deve se comportar da mesma forma que um linkedList. Nodo aponta para nodo que aponta para nodo…

Ex.: Nodo “I” aponta para nodo “V” que aponta para nodo “O”, temos ai Ivo, se fosse necessário concatenar mais um caracter bastava o java criar ele na memória e o nodo “O” iria apontar para ele.

Talvez eu tenha falado muita besteira…

Quando um StringBuffer chama o append ele chama esse método

public AbstractStringBuilder append(String str) {
	if (str == null) str = "null";
        int len = str.length();
	if (len == 0) return this;
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
	str.getChars(0, len, value, count);
	count = newCount;
	return this;
    }

Da uma olhada no source do java que voce ve isso.

Em 99% das vezes é melhor esquecer StringBuffer e usar StringBuilder no lugar.

nao é a mesma coisa…

String vc tem objetos perdidos
StringXXXX = ele trabalha em cima dos objetos evitando criar objetos perdidos na memoria…

import static java.lang.System.out;
public class Mult {

	public static void main(String[] args) {
		String s="scjp";
			s.concat("neto");//objeto criado porem perdido sem referencia
		System.out.println(" " +s);
	}}

Usando a StringBuilder/Buffer

public class Builder {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder("cavalo");
			sb.append("preto");
		System.out.println(sb);
	}
	/* imprime cavalo preto*/
//vc ver algum objeto perdido?
}

Use a StringBuilder pois ela é mais rapida que Buffer devido a Builder nao ter metodos sincronizados…
Ela está disponivel a partir da versao 1.5. Agora as duas classes tem agem da mesma fora, porem com essa diferença que falei acima

flw! :lol:

cara StringBuffer tem um peso a ser considerado… então use StringBuilder que será mais rápido…