Quantos caracteres uma String suporta?

Bom dia!

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???

Obrigado

Se vc quer uma “string mutável” use a classe StringBuilder (não é thread safe) ou StringBuilder (thread safe).

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.

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…

Bah… muito bom… obrigado pela informação “preciosa” :slight_smile: era disto que eu precisava… valew