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 + " " + " "
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…
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.
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();