Quanti caratteri può avere una stringa Java?


157

Sto provando il problema The Next Palindrome di Sphere Online Judge (SPOJ), dove devo trovare un palindrome per un numero intero di un massimo di un milione di cifre. Ho pensato di utilizzare le funzioni di Java per invertire le stringhe, ma consentirebbero a una stringa di essere così lunga?


stai dicendo che devi scrivere una funzione che genera palindromi, la cui dimensione è specificata dall'utente e può avere una lunghezza massima di 1 milione di caratteri?
Robert,

3
Il problema (da SPOJ) può contenere un file da 100Gigabyte e ti piace caricarlo in una stringa contemporaneamente? Scherzi a parte ... per favore usa uno scanner!
Grim

Possibile duplicato della lunghezza massima
Bergi

Risposte:


242

Dovresti essere in grado di ottenere una stringa di lunghezza

  1. Integer.MAX_VALUEsempre 2.147.483.647 (2 31 - 1)
    (Definito dalla specifica Java, la dimensione massima di un array, che la classe String utilizza per la memoria interna)
    OPPURE

  2. Half your maximum heap size(poiché ogni carattere è di due byte) qualunque sia più piccolo .


43
... o la dimensione massima dell'heap divisa per 2 ... poiché il carattere è 2 byte
ChssPly76

2
@ ChssPly76: Sì, è corretto. Ho modificato la mia risposta, grazie.
Bill the Lizard,

2
come faccio a sapere la dimensione massima dell'heap? Inoltre, non so quale macchina virtuale Java sta usando il giudice per testare il mio problema è Integer.MAX_VALUE parte delle specifiche di JVM dipendente?
andandandand

6
Integer.MAX_VALUE è sempre 2147483647 (2 ^ 31 - 1), che fa parte delle specifiche Java.
cd1,

4
Supponendo una JVM a 64 bit, poiché per archiviare una stringa di tale lunghezza occorrerebbero 8 GB di memoria virtuale.
Robert Fraser,

21

Credo che possano contenere fino a 2 ^ 31-1 caratteri, poiché sono mantenuti da un array interno e gli array sono indicizzati da numeri interi in Java.


L'implementazione interna è irrilevante - non c'è motivo per cui i dati dei personaggi non possano essere archiviati in una serie di long, ad esempio. Il problema è che l'interfaccia utilizza ints per lunghezza. getBytese simili potrebbero avere problemi se provi una stringa molto grande.
Tom Hawtin - tackline

Questo è vero - stavo insinuando questo fatto. Colpa mia.
aperkins,

15

Sebbene in teoria sia possibile caratteri Integer.MAX_VALUE, la JVM ha dimensioni limitate dell'array che può utilizzare.

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

su Oracle Java 8 aggiornamento 92 stampe

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: in Java 9, Strings utilizzerà byte [], il che significa che i caratteri multi-byte utilizzeranno più di un byte e ridurranno ulteriormente il massimo. Se hai tutti i punti di codice a quattro byte, ad esempio emoji, otterrai solo circa 500 milioni di caratteri


2
Le stringhe compatte in Java 9 utilizzano la codifica Latin-1 o UTF-16. Nessuna codifica a lunghezza variabile, ovvero nessun carattere a tre byte.
apangin

@apangin "Non è un obiettivo utilizzare codifiche alternative come UTF-8" grazie per la correzione.
Peter Lawrey,

5

Hai pensato di utilizzare BigDecimalinvece di Stringtenere i tuoi numeri?


1
Dipende da cosa l'applicazione farà con i numeri. Se farà solo cose testuali come trovare palindromi, contare cifre (decimali), allora una stringa è meglio. Se sta per fare l'aritmetica, un BigDecimal (o BigInteger) è meglio.
Stephen C,

Il problema è "Per ogni K, genera il più piccolo palindromo più grande di K." (dove K è il numero indicato). Sarebbe banalmente semplice produrre il primo palindromo più piccolo di K. Dovresti trovare l'aritmetica per trovarne uno più grande di K. Esempio: trova il prossimo palindromo più grande di 999999999999 o il palindromo successivo più grande di 12922.
Thorbjørn Ravn Andersen

4

Integer.MAX_VALUE è la dimensione massima della stringa + dipende dalla dimensione della memoria ma il problema sul giudice online della sfera non è necessario utilizzare tali funzioni


3

Java9 utilizza byte [] per memorizzare String.value, quindi è possibile ottenere solo circa 1 GB di stringhe in Java9. Java8 d'altra parte può avere stringhe da 2 GB.

Per carattere intendo "caratteri", alcuni personaggi non sono rappresentabili in BMP (come alcuni degli emoji), quindi ci vorranno più (attualmente 2) caratteri.


4
Potresti collegare un riferimento per Java-9 che limita la dimensione della stringa a 1 GB da 2 GB
Aditya Gupta,

-1

La parte del mucchio peggiora, amici miei. UTF-16 non è garantito per essere limitato a 16 bit e può espandersi a 32


2
Tranne che il chartipo di Java ha esattamente 16 bit, quindi il numero di bit che UTF-16 usa non ha molta importanza ...
awksp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.