Quantos caracteres uma String Java pode ter?

Estou tentando o problema do Next Palindrome do Sphere Online Judge (SPOJ) onde preciso encontrar um palíndromo para um número inteiro de até um milhão de dígitos. Pensei em usar as funções do Java para reverter o Strings, mas eles permitiriam que um String durasse tanto?

Você deve conseguir uma String de comprimento Inteiro.MAX_VALUE (sempre 2147483647 (2 31 – 1) pela especificação Java, o tamanho máximo de uma matriz, que a class String usa para armazenamento interno) ou metade do tamanho máximo de heap ( já que cada caractere tem dois bytes), o que for menor.

Eu acredito que eles podem ter até 2 ^ 31-1 caracteres, pois são mantidos por um array interno, e os arrays são indexados por inteiros em Java.

Embora você possa, em teoria, os caracteres Integer.MAX_VALUE, a JVM é limitada no tamanho da matriz que pode usar.

 public static void main(String... args) { for (int i = 0; i < 4; i++) { int len = Integer.MAX_VALUE - i; try { char[] ch = new char[len]; System.out.println("len: " + len + " OK"); } catch (Error e) { System.out.println("len: " + len + " " + e); } } } 

em impressões do Oracle Java 8 update 92

 len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483645 OK len: 2147483644 OK 

Nota: no Java 9, o Strings usará o byte [], o que significa que os caracteres de múltiplos bytes usarão mais de um byte e reduzirão o máximo ainda mais. Se você tiver todos os quatro pontos de código de byte, por exemplo, emojis, você só terá cerca de 500 milhões de caracteres

Você já pensou em usar BigDecimal vez de String para armazenar seus números?

Integer.MAX_VALUE é o tamanho máximo da string + depende do tamanho da sua memory, mas o juiz online da Problem on sphere não precisa usar essas funções

Java9 usa byte [] para armazenar String.value, então você só pode obter cerca de 1GB Strings em Java9. Java8, por outro lado, pode ter 2GB Strings.

Por caractere quero dizer “char” s, algum caractere não é representável em BMP (como alguns dos emojis), então vai demorar mais (atualmente 2) chars.

A parte do heap piora, meus amigos. UTF-16 não é garantido para ser limitado a 16 bits e pode expandir para 32

Se você usa o mecanismo de aplicativos do Google, com.google.appengine.api.datastore.Text pode ajudar. Permite que uma única string armazene até 1 megabyte.