Combien de caractères une chaîne Java peut-elle avoir?

J’essaie le problème du prochain palindrome de Sphere Online Judge (SPOJ) où je dois trouver un palindrome pour un nombre entier allant jusqu’à un million de chiffres. J’ai pensé à utiliser les fonctions de Java pour inverser les chaînes, mais permettraient-elles à une chaîne d’être aussi longue?

Vous devriez pouvoir obtenir une chaîne de longueur Integer.MAX_VALUE (toujours 2147483647 (2 31 – 1) par la spécification Java, la taille maximale d’un tableau, utilisée par la classe Ssortingng pour le stockage interne) ou la moitié de votre taille de segment maximale ( puisque chaque caractère est deux octets), selon la valeur la plus petite.

Je crois qu’ils peuvent comporter jusqu’à 2 ^ 31-1 caractères, car ils sont détenus par un tableau interne, et les tableaux sont indexés par des nombres entiers en Java.

Bien que vous puissiez en théorie utiliser les caractères Integer.MAX_VALUE, la taille de la baie peut être utilisée pour la JVM.

 public static void main(Ssortingng... 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); } } } 

sur Oracle Java 8 mise à jour 92 impressions

 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 

Note: dans Java 9, Ssortingngs utilisera l'octet [], ce qui signifie que les caractères multi-octets utiliseront plus d'un octet et réduiront davantage le maximum. Si vous avez tous les points de code à quatre octets, par exemple les emojis, vous n’obtiendrez qu’environ 500 millions de caractères.

Avez-vous envisagé d’utiliser BigDecimal au lieu de Ssortingng pour contenir vos numéros?

Integer.MAX_VALUE est la taille maximale de la chaîne + dépend de la taille de votre mémoire mais le problème du juge en ligne de la sphère ne vous oblige pas à utiliser ces fonctions

Java9 utilise l’octet [] pour stocker Ssortingng.value, vous ne pouvez donc obtenir qu’environ 1 Go de chaînes dans Java9. Java8 d’autre part peut avoir des chaînes de 2 Go.

Par caractère, je veux dire “char”, certains caractères ne sont pas représentables dans BMP (comme certains emojis), il faudra donc plus de caractères (actuellement 2).

La partie du tas empire, mes amis. UTF-16 ne peut être limité à 16 bits et peut être étendu à 32 bits

Si vous utilisez le moteur d’application de Google, com.google.appengine.api.datastore.Text peut vous aider. Il permet à une seule chaîne de stocker jusqu’à 1 Mo.