web-dev-qa-db-fra.com

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

J'essaie The Next Palindrome problème de Sphere Online Judge (SPOJ) où je dois trouver un palindrome pour un entier pouvant aller jusqu'à un million de chiffres. J'ai pensé utiliser les fonctions de Java pour inverser les chaînes, mais permettraient-elles qu'une chaîne soit aussi longue?

149
andandandand

Vous devriez pouvoir obtenir une chaîne de longueur

  1. Integer.MAX_VALUE toujours 2 147 483 647 (231 - 1)
    (Défini par la spécification Java, la taille maximale d'un tableau, que la classe String utilise pour le stockage interne)
    OU

  2. _Half your maximum heap size_ (puisque chaque caractère est constitué de deux octets) , le plus petit des deux .

226
Bill the Lizard

Je pense qu’ils peuvent contenir jusqu’à 2 ^ 31-1 caractères, car ils sont gérés par un tableau interne, et les tableaux sont indexés par des entiers en Java.

19
aperkins

Bien que vous puissiez théoriquement utiliser les caractères Integer.MAX_VALUE, la taille de la matrice JVM pouvant être utilisée est limitée.

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);
        }
    }
}

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

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

12
Peter Lawrey

Avez-vous envisagé d'utiliser BigDecimal au lieu de String pour conserver vos numéros?

5

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

4
Mite Mitreski

Java9 utilise byte [] pour stocker String.value, de sorte que vous ne pouvez obtenir que des chaînes d'environ 1 Go en Java9. Java8 d'autre part peut avoir des chaînes de 2 Go.

Par caractère, je veux dire "caractères", un caractère n'est pas représentable dans BMP (comme certains emojis), il faudra donc plus de caractères (actuellement 2).

2
Revin

La partie de tas empire, mes amis. UTF-16 n'est pas garanti d'être limité à 16 bits et peut s'étendre jusqu'à 32

0
Joe Plante