Tenho um objeto do tipo String que recebe valor de um arquivo de propriedades xml, no caso, são códigos sql, existem códigos sql dentro do sistema que são gigantescos… portanto o objeto do tipo String preenche uma parte dele…
Como faço para aumentar a capacidade deste String???
Uma String é implementada usando-se um char[], e como você deve saber, o tamanho máximo teórico de um array é de 2^31-1 elementos (2 bilhões e poucos caracteres).
Como o Buzzato ressaltou, é melhor criar a String usando um StringBuilder (ou talvez StringBuffer).
Isso porque a concatenação de strings usando “+” ou “+=” é muito, muito lenta, porque ela cria novos objetos String e faz cópias dos valores; enquanto usar StringBuilder.append é muito mais rápido, porque não cria novos objetos, nem faz cópias de valores se você deixar a StringBuilder já alocada com o tamanho esperado.
// Rode este programa com:
//
// java -Xcomp -Xmx128m -cp . TesteAppend
//
// (Se estiver usando o JDK, experimente com:
//
// java -server -Xcomp -Xmx128m -cp . TesteAppend
//
class TesteAppend {
private static void gerarStrings (String[] strings) {
for (int i = 0; i < strings.length; ++i) {
strings[i] = String.valueOf (i);
}
}
private static void teste1 (String[] strings) {
String result = "";
for (int i = 0; i < strings.length; ++i) {
result += strings[i];
}
System.out.println (result.length());
}
private static void teste2 (String[] strings) {
StringBuilder sb = new StringBuilder();
String result;
for (int i = 0; i < strings.length; ++i) {
sb.append (strings[i]);
}
result = sb.toString();
System.out.println (result.length());
}
private static void teste3 (String[] strings, int alloc) {
StringBuilder sb = new StringBuilder(alloc);
String result;
for (int i = 0; i < strings.length; ++i) {
sb.append (strings[i]);
}
result = sb.toString();
System.out.println (result.length());
}
public static void main(String[] args) {
long time;
String[] strings = new String[1000000];
System.out.println ("Gerando 1 milhão de strings...");
time = System.currentTimeMillis();
gerarStrings(strings);
time = System.currentTimeMillis() - time;
System.out.println ("Tempo gasto: " + time + " ms");
System.out.println ("Concatenando 1 milhão de strings usando StringBuilder.append");
time = System.currentTimeMillis();
teste2(strings);
time = System.currentTimeMillis() - time;
System.out.println ("Tempo gasto: " + time + " ms");
System.out.println ("Concatenando 1 milhão de strings usando StringBuilder.append (prealocado)");
time = System.currentTimeMillis();
teste3(strings, 6000000);
time = System.currentTimeMillis() - time;
System.out.println ("Tempo gasto: " + time + " ms");
System.out.println ("Concatenando 1 milhão de strings usando +=");
time = System.currentTimeMillis();
teste1(strings);
time = System.currentTimeMillis() - time;
System.out.println ("Tempo gasto: " + time + " ms");
}
}
Rodando o programa acima, obtive a seguinte resposta parcial:
Gerando 1 milhão de strings...
Tempo gasto: 469 ms
Concatenando 1 milhão de strings usando StringBuilder.append
5888890
Tempo gasto: 78 ms
Concatenando 1 milhão de strings usando StringBuilder.append (prealocado)
5888890
Tempo gasto: 62 ms
Concatenando 1 milhão de strings usando +=
....
Após vários minutos, desisti de esperar o programa concatenar o tal milhão de strings. Para ver como usar “+=” ou “+” é realmente lento…