Chaîne de caractères de longueur Maximale en Java - l'appel de la longueur() la méthode
Dans Java, quelle est la taille maximale d'un String
objet peut, en se référant à la length()
appel de méthode?
Je sais que length()
de retour de la taille d'un String
comme un char []
;
- Tandis que la longueur d'un
String
est théoriquementInteger.MAX_VALUE
, la longueur d'une chaîne de caractères littérale dans la source semble être limité à seulement 65535 octets de données UTF-8.
Vous devez vous connecter pour publier un commentaire.
Compte tenu de la
String
de la classe delength
méthode retourne unint
, la longueur maximale qui serait retourné par la méthode seraitInteger.MAX_VALUE
, qui est2^31 - 1
(soit environ 2 milliards de dollars.)En termes de longueurs et de l'indexation des tableaux, (comme
char[]
, ce qui est probablement la voie à l'intérieur de la représentation des données est mis en œuvre pourString
s), Chapitre 10: Matrices de Java Langage de Spécification, Java SE 7 Édition dit ce qui suit:En outre, l'indexation doit être par
int
valeurs, comme mentionné dans La Section 10.4:Par conséquent, il semble que la limite est en effet
2^31 - 1
, qui est la valeur maximale pour un non négatifint
valeur.Cependant, il existe probablement d'autres limitations, telles que le maximum pouvant être affectés de la taille d'un tableau.
javac
donne une erreur à ce sujet littérale, trop longue:javac HelloWorld.java 2>&1|head -c 80 HelloWorld.java:3: constant string too long
javac
pourString
littéraux (pasString
objets), comme je ne trouve aucune référence à des limites de taille pourString
littéraux dans le Langage Java, la Spécification et de la Spécification de la JVM. J'ai essayé de faire unString
littéral qui était de plus de 100 000 caractères, et l'Éclipse compilateur n'ai pas de problème à le compiler. (Et l'exécution du programme a été en mesure de montrer que le littéral avait unString.length
de plus de 100 000 habitants.)char[]
ouStringBuilder
. Vous pouvez acheter de 64 GO pour environ 400$, de sorte que même cela ne représente pas beaucoup de mémoire.char[]
longueur deInteger.MAX_VALUE-2
. DepuisString
utilise unchar
tableau, le courant limite pratique est légèrement inférieur à celui de la limite théorique.java.io.DataInput.readUTF()
etjava.io.DataOutput.writeUTF(String)
dire qu'unString
objet est représenté par deux octets de la longueur de l'information et de la modifié UTF-8 représentation de chaque caractère dans la chaîne. Cette conclut que la longueur de la Chaîne est limitée par le nombre d'octets de la modification de l'encodage UTF-8 représentation de la chaîne lorsqu'il est utilisé avecDataInput
etDataOutput
.En outre, La spécification de
CONSTANT_Utf8_info
trouvé dans la machine virtuelle Java spécification définit la structure comme suit.Vous pouvez trouver que la taille de la "longueur" est deux octets.
Que le type de retour d'une certaine méthode (par exemple,
String.length()
) estint
ne signifie pas toujours que son permis et la valeur maximale estInteger.MAX_VALUE
. Au lieu de cela, dans la plupart des cas,int
est choisie pour des raisons de performances. Le langage Java spécification indique que les nombres entiers dont la taille est plus petite que celle deint
sont convertis àint
avant le calcul (si ma mémoire est bonne) et c'est une des raisons de choisirint
quand il n'y a pas de raison particulière.La longueur maximale au moment de la compilation est à plus de 65536. A noter encore que la longueur est le nombre d'octets de la modifié UTF-8 de représentation, et non le nombre de caractères dans un
String
objet.String
objets peuvent être en mesure d'avoir beaucoup plus de caractères lors de l'exécution. Cependant, si vous souhaitez utiliserString
objets avecDataInput
etDataOutput
interfaces, il est préférable d'éviter d'utiliser trop longtempsString
objets. J'ai trouvé cette limitation, lorsque j'ai mis en place Objective-C équivalents deDataInput.readUTF()
etDataOutput.writeUTF(String)
.Depuis les tableaux doivent être indexées par les entiers, la longueur maximale d'un tableau est
Integer.MAX_INT
(231-1 ou 2 147 483 647). C'est en supposant que vous avez assez de mémoire pour contenir un tableau de cette taille, bien sûr.apparemment c'est lié à un int, qui est 0x7FFFFFFF (2147483647).
J'ai un iMac 2010 avec 8 go de RAM, Eclipse Néon.Version 2 (4.6.2) avec Java 1.8.0_25. Avec la machine virtuelle de l'argument-Xmx6g, j'ai couru le code suivant:
Cette affiche:
Donc, il semble que le max taille de la matrice est ~1,207,959,549. Puis j'ai réalisé que nous n'avons pas de soins si Java est à court de mémoire: nous sommes juste à la recherche de la taille maximale de la matrice (ce qui semble être une constante définie quelque part). Donc:
Qui imprime:
Il me semble que le max est de type Entier.MAX_VALUE - 2, ou (2^31) - 3
P. S. je ne sais pas pourquoi mon
StringBuilder
maxed à1207959550
alors que monchar[]
plafonné à (2^31)-3. Il semble queAbstractStringBuilder
double la taille de son internechar[]
à la développer, de sorte que probablement à l'origine du problème.Le type de Retour de la longueur() la méthode de la classe String est int.
Reportez-vous http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#length()
Donc le maximum de valeur de type int est 2147483647.
Chaîne est considérée comme char tableau en interne,de Sorte que l'indexation se fait à l'intérieur de la portée maximale.
Cela signifie que nous ne pouvons pas l'indice de la 2147483648th membre.Donc, la longueur maximale de Chaîne de caractères en java 2 147 483 647.
Type de données primitif int fait 4 octets(32 bits) en java.1 bits (MSB) est utilisé comme un bit de signe,La gamme est limitée dans -2^31 à 2^31-1 (-2147483648 à 2147483647).
Nous ne pouvons pas utiliser des valeurs négatives pour l'indexation.Alors, évidemment, la gamme que nous pouvons utiliser est de 0 à 2 147 483 647.