Strings e StringBuilder, imutáveis ate que ponto?

Buenas pessoal…

A duvida é bastante simples e já esclareci bastante lendo outros topicos sobre
o assunto, que String são objetos imutáveis e são criadas novas instancias etc…
e que StrinBuilder é mais rapido que Buffer pq não é sincronizado etc…

Então, estou desenvolvendo uma app para um HandHeld HP iPaq, usando
J2SE, com MySaifu e Swing, está legal, mas to precisando tomar muito cuidado
com os objetos pra não estourar a memoria…

e um dos problemas está na exportação de um arquivo .txt no HH para o PC,
logo gostaria de saber se há diferença em fazer, por exemplo:

// Todos os métodos retornam leem atributos e retornam String;
String s = pessoa.getCodigo + ";" + pessoa.getLeitura + ";" + leitura.getAnoMes;

// Ou fazer isso...
StringBuilder sb = new StringBuilder();
sb.append(pessoa.getCodigo);
sb.append(";");
sb.append(pessoa.getLeitura);
sb.append(";");
sb.append(leitura.getAnoMes);

Considerando que são vários campos e já notei muita diferença ao NÃO usar o " += "
Então o que eu queria saber é se são criadas novas instancias de String ao concatenar
manualmente elas com + " " + " "

Obrigado!!!

a) String é imutável mas StringBuilder não é imutável
b)

String s = pessoa.getCodigo + ";" + pessoa.getLeitura + ";" + leitura.getAnoMes; 

é transformado pelo compilador em:

String s = ((new StringBuffer (pessoa.getCodigo()).append (";").append (pessoa.getLeitura()).append (";").append (leitura.getAnoMes()).toString();

Ou seja, nesse caso em particular, dá na mesma, e use o código que seja mais claro para você.

Mas é claro que “+=” não se deve usar, dentro da medida do possível.

[quote=dooda]Buenas pessoal…

A duvida é bastante simples e já esclareci bastante lendo outros topicos sobre
o assunto, que String são objetos imutáveis e são criadas novas instancias etc…
e que StrinBuilder é mais rapido que Buffer pq não é sincronizado etc…

Então, estou desenvolvendo uma app para um HandHeld HP iPaq, usando
J2SE, com MySaifu e Swing, está legal, mas to precisando tomar muito cuidado
com os objetos pra não estourar a memoria…

e um dos problemas está na exportação de um arquivo .txt no HH para o PC,
logo gostaria de saber se há diferença em fazer, por exemplo:

// Todos os métodos retornam leem atributos e retornam String;
String s = pessoa.getCodigo + ";" + pessoa.getLeitura + ";" + leitura.getAnoMes;

// Ou fazer isso...
StringBuilder sb = new StringBuilder();
sb.append(pessoa.getCodigo);
sb.append(";");
sb.append(pessoa.getLeitura);
sb.append(";");
sb.append(leitura.getAnoMes);

Considerando que são vários campos e já notei muita diferença ao NÃO usar o " += "
Então o que eu queria saber é se são criadas novas instancias de String ao concatenar
manualmente elas com + " " + " "

Obrigado!!!
[/quote]

O compilador é inteligente e transforma o primeiro em algo bem parecido com o segundo.

// Isso:
String s = pessoa.getCodigo + ";" + pessoa.getLeitura + ";" + leitura.getAnoMes;

// O compilador (java 1.5 ou maior) transforma em:
String s = new StringBuilder(pessoa.getCodigo)
    .append(";")
    .append(pessoa.getLeitura)
    .append(";")
    .append(leitura.getAnoMes)
    .toString();

// Compiladores java 1.4 ou menores usam StringBuffer ao invés de StringBuilder.

EDIT: Putz, não dá para ser mais rápido que o thingol…

Pois é pessoal…

realmente eu só notei dieferença extrema ao usar o +=
nas duas outras maneiras, teve a mesma performance…

Obrigado!!!

Uma coisa que ainda dá para melhorar é usar char em vez de string para o ponto-e-virgula
Não é muito mas elimina essa string do pool.

StringBuilder sb = new StringBuilder()
.append(pessoa.getCodigo)
.append(';')
.append(pessoa.getLeitura)
.append(';')
.append(leitura.getAnoMes);

aproveite tb a interface fluente do stringbuilder para escrever menos.

Quando preciso concatenar diversas variáveis string, usualmente é porque eu preciso efetuar um log, ou coisa parecida (SQL deve ser feito com PreparedStatement, e não se fala mais nisso).
Nesse caso, acaba-se precisando também de formatação adequada, e eu uso o velho e bom String.format (que é a forma disfarçada do printf). É mais lento que concatenar as strings com StringBuilder.append, concordo, mas acho mais flexível.

pois é Sergio…

nesse dispositivo, onde os recursos são bem limitados…
qualquer Char, pode fazer a diferença… :wink:

Mas agora a usabilidade x performance está bem legal…

é meu primeiro projeto nessa plataforma…

estou usando MySaifu + Swing + HSQLDB…

no HandHeld HP iPaq hx2400, e está rodando blz, numa app
para leituras de energia eletrica a campo…

:smiley:

Vallew pela força ae pessoal…

thignol, este meu arquivo .txt devia sair formatado tambem com numericos com zeros a direita
etc…

na minha situação, sem chances de usar… ficou super lento a exportação formatando os valores… :frowning:

e acho que não tinha nada demais nisso

return String.format("%012d", aNumber);

sei lá, por isso usei o “;”

No seu caso, String.format é realmente lento se você usá-lo como um encapsulamento. Você tem de usá-lo dessa forma:

String s = String.format ("%04d|%03d|%02d", 
                pessoa.getCodigo(), pessoa.getLeitura(), pessoa.getAnoMes());

ou melhor ainda, você nem cria diretamente uma string; você já pega seu arquivo de saída, e o encapsula em um PrintWriter. Como essa classe tem o método printf, você pode usá-lo mais ou menos como:

PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("saida.txt")));
pw.printf ("%04d|%03d|%02d", 
                pessoa.getCodigo(), pessoa.getLeitura(), pessoa.getAnoMes());
pw.close();

hmm, interessante essa saída…

vou testar depois… =D

vallew’s