Java nouveau tableau d'octets de taille 2^32
En Java, il ne me permet pas d'utiliser un long temps pour quelque chose comme ceci:
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
Et un int ne peut aller aussi haut que 0x7FFFFFFF (2^31-1). Est-il possible de déclarer un tableau d'octets de cette taille?
Pas forcément dupe mais voir ceci: stackoverflow.com/questions/3038392/...
Grâce à ce qui en fait essentiellement des réponses à ma question.
J'allais dire que vous ne pouvez pas avoir plus de 2^31-1 éléments dans un tableau. Et comme nous pouvons le voir, même, dans certains cas, vous pouvez même pas l'atteindre.
(2^31 - 1) == 0x7FFFFFFF. Si vous voulez savoir.
oups, édité. merci
Grâce à ce qui en fait essentiellement des réponses à ma question.
J'allais dire que vous ne pouvez pas avoir plus de 2^31-1 éléments dans un tableau. Et comme nous pouvons le voir, même, dans certains cas, vous pouvez même pas l'atteindre.
(2^31 - 1) == 0x7FFFFFFF. Si vous voulez savoir.
oups, édité. merci
OriginalL'auteur Eric B | 2012-11-16
Vous devez vous connecter pour publier un commentaire.
Réponse est
NO
comme c'est le max possible d'initialisation:En effet, la mémoire est nécessaire.
Voir aussi Java les tableaux ont une taille maximale?
OriginalL'auteur Yogendra Singh
Déclarer la
size
comme unint
et essayez de nouveau:Un tableau ne peut être déclaré positif
int
taille, pas unlong
. Et remarquez que le maximum deint
valeur positive (et donc, la taille maximale possible pour un tableau d'entiers, en supposant qu'il y a assez de mémoire disponible) est0x7FFFFFFF == Integer.MAX_vALUE
.vous avez raison, j'ai corrigé avec la valeur correcte
OriginalL'auteur Óscar López
Entier.MAX_VALUE est la limite pour le nombre de java concepts. Par exemple Chaîne/Liste ne peut pas être plus que cela.
En 1995 lors de Java a été créé, 4 MO de mémoire totale est la norme.
Le même problème existe dans la plupart des langues. Mais si nous sommes à la conception d'un nouveau langage d'aujourd'hui, nous serions certainement utiliser
long
.OriginalL'auteur irreputable
Le problème dans votre exemple, c'est que le tableau de créer de la fonction attend un int en argument et vous avez été en passant un long.
Cette compile:
Mais ne fonctionne pas. Elle n'est pas exécutée dans cet exemple particulier de
long
parce que le nombre est négatif, et vous ne pouvez pas créer un tableau avec un nombre négatif des éléments. Mais encore, il est possible d'utiliser une variable de type long pour créer un tableau, mais il faut être un nombre positif et ont besoin d'être jeté à l'int, comme suit:Compiler et de travail.
Par la manière, l'évolution de la taille de
Integer.MAX_VALUE
ne rien accomplir si cela dépasse les limites de la mémoire de la JVM.La gestion de la mémoire est (la plupart du temps) un problème de la JVM.
Il compile mais donne
java.lang.NegativeArraySizeException
à la deuxième ligne comme(int)size
->-1
.Avez-vous essayé?
Vous voyez, c'est parce que vous êtes de passage à un négatif int en paramètre. Et en tant que tel, il n'est pas possible de créer un tableau avec des éléments négatifs. Il compile parce que les acteurs n'est disponible que sur l'exécution et c'est quand il dit que c'est une NegativeArraySizeException
OriginalL'auteur Bruno Vieira
Je suis d'accord que vous ne pouvez pas avoir un byte[] avec plus de nombre Entier.MAX_VALUE éléments. Cependant, vous pouvez avoir un tableau de tableaux.
Je suggère d'écrire une classe qui a:
Un constructeur qui prend un long taille et construit un byte[][] assez grand
pour contenir de nombreux éléments.
Méthodes Get et set qui utilisent un long index
Une méthode size() qui renvoie une longue.
Bien sûr, ce n'est pratique avec une JVM 64 bits et une grande quantité de mémoire suffisante.
J'ai senti même de retour dans les années 1990 que le choix de l'int plutôt que de longs pour les index du tableau et des types de longueur était myope. Le soleil était de la vente de plusieurs machines avec des dizaines de giga-octets de mémoire, et il y a eu une tendance uniforme à la fois pour le maximum de la taille des matrices à l'approche de tailles de mémoire, et pour les tailles de mémoire de croître.
J'ai du mal à trouver une quelconque utilité pratique pour les 4 go de tableau. Si vous avez besoin d'un, c'est probablement une erreur de conception.
Voici le premier exemple que je pensais de - représentant un génome avec un octet par les paires de base. Même le génome humain, à 3 milliards de paires de bases, ce serait trop grande pour une seule Java tableau. Certaines plantes ont plus de génomes.
Je dois également ajouter que dans les années 1970, j'ai entendu des objections semblables à des tableaux supérieure à 64 ko éléments. Il y a eu une histoire continue de pair avec une augmentation dans les tailles de mémoire et le maximum de la taille des matrices.
Et pourquoi un langage orienté objet qui sera bon pour ce genre de pure data crunching? Chevaux pour les cours. Alors que le maximum de RAM disponible pour une VM ne pas dépasser le téraoctet limite, un seul objet plus grand que la 4G n'a guère de sens. Quand il va commencer à faire sens, changement de tableau d'indexation à long sera relativement indolore affaire.
OriginalL'auteur Patricia Shanahan
Ce n'est pas possible. Taille de la matrice prend en charge uniquement les valeurs int.
Vous pouvez cocher la case JDK le code source pour les tableaux. Seulement int valeurs sont prises en charge.
int
ou d'autres types qui peuvent être promus àint
.OriginalL'auteur messivanio