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???
Se vc quer uma “string mutável” use a classe StringBuilder (não é thread safe) ou StringBuilder (thread safe).
E
entanglement
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).
Não há limitações práticas, no seu caso.
E
entanglement
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.
E
entanglement
// Rode este programa com://// java -Xcomp -Xmx128m -cp . TesteAppend//// (Se estiver usando o JDK, experimente com://// java -server -Xcomp -Xmx128m -cp . TesteAppend//classTesteAppend{privatestaticvoidgerarStrings(String[]strings){for(inti=0;i<strings.length;++i){strings[i]=String.valueOf(i);}}privatestaticvoidteste1(String[]strings){Stringresult="";for(inti=0;i<strings.length;++i){result+=strings[i];}System.out.println(result.length());}privatestaticvoidteste2(String[]strings){StringBuildersb=newStringBuilder();Stringresult;for(inti=0;i<strings.length;++i){sb.append(strings[i]);}result=sb.toString();System.out.println(result.length());}privatestaticvoidteste3(String[]strings,intalloc){StringBuildersb=newStringBuilder(alloc);Stringresult;for(inti=0;i<strings.length;++i){sb.append(strings[i]);}result=sb.toString();System.out.println(result.length());}publicstaticvoidmain(String[]args){longtime;String[]strings=newString[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…
D
dahenz
Bah… muito bom… obrigado pela informação “preciosa” era disto que eu precisava… valew