Nous pouvons déterminer la longueur d'un en ArrayList<E>
utilisant sa méthode publique size()
, comme
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
De même, nous pouvons déterminer la longueur d'un Array
objet en utilisant la length
propriété
String[] str = new String[10];
int size = str.length;
Alors que la size()
méthode de ArrayList
est définie dans la ArrayList
classe, où est cette length
propriété de Array
defined?
Réponses:
Les tableaux sont des objets spéciaux en java, ils ont un attribut simple nommé
length
qui estfinal
.Il n'y a pas de "définition de classe" d'un tableau (vous ne pouvez le trouver dans aucun fichier .class), ils font partie du langage lui-même.
Ressources:
la source
ArrayList.size()
fournit le nombre d'objets réellement stockés dans le tableau tandis quemyArray.length
([]
) fournit la "capacité". Autrement dit, si pourmyArray = new int[10];
, il renvoie 10. Ce n'est pas le nombre d'objets que vous avez mis dans le tableau.List
car cela utilise des tableaux dans leurs implémentations.Il est « spécial » au fond, avec sa propre instruction de bytecode:
arraylength
. Donc, cette méthode:est compilé en bytecode comme ceci:
Il n'est donc pas accessible comme s'il s'agissait d'un champ normal. En effet, si vous essayez de l'obtenir comme s'il s'agissait d'un champ normal, comme celui-ci, il échoue:
Donc, malheureusement, la description JLS de chaque type de tableau ayant un champ final public
length
est quelque peu trompeuse :(la source
int[]
que les génériques ne s'appliquent pas aux types primitifs? (Et diable, les génériques n'existaient pas depuis longtemps de toute façon.) Vous pourriez vous en tirer sans tableaux en utilisant des listes liées pour toutes les collections, mais ce serait terrible pour l'efficacité.StringBuffer
classe elle-même le fait, oui - car elle contient une référence à unchar[]
(ou l'a fait, du moins; je ne sais pas si elle le fait toujours, de manière autonome). Ainsi, alors que aStringBuilder
est responsable de plus de mémoire, sa taille et sa disposition immédiates sont fixes.Il est défini dans la spécification du langage Java :
Puisqu'il y a un nombre illimité de types de tableaux (pour chaque classe il y a un type de tableau correspondant, et puis il y a des tableaux multidimensionnels), ils ne peuvent pas être implémentés dans un fichier de classe; la JVM doit le faire à la volée.
la source
Même si ce n'est pas une réponse directe à la question, c'est un ajout à l' argument
.length
vs..size()
Je cherchais quelque chose en rapport avec cette question, donc quand je l'ai rencontrée, j'ai remarqué que la ou les définitions fournies icin'est pas "exactement" correct.
La longueur du champ contient le nombre d' emplacements disponibles pour placer un composant, pas le nombre de composants présents dans le tableau. Il représente donc la mémoire totale disponible allouée à ce tableau, et non la quantité de cette mémoire qui est remplie.
Exemple:
Production:
Cependant, la
.size()
propriété de laArrayList
donne le nombre d'éléments dans la liste:Production:
la source
null
et les éléments non nuls. Mais la distinction ne fonctionne pas. Après tout, lesize()
(disons) aList
peut aussi inclure desnull
valeurs.size
se comporte dynamiquement, tandis quelength
c'est une propriété statique ... le fait que l'espace restant non rempli dans un tableau est initialisé à " Non Values " (selon le type) ne contredit pas vraiment ce point.c'est le champ final public, qui contient le nombre de composants du tableau (la longueur peut être positive ou nulle)
Un tableau a donc les mêmes champs et méthodes publics que la classe suivante:
plus d'infos sur
10.7 Membres de groupe
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
la source
Pour y répondre tel quel, où est définie cette propriété de longueur du tableau ? Dans une spéciale
Object header
.Facile à voir via JOL
L'une des lignes de cette sortie va être:
Habituellement, les objets ont deux en-têtes (mark et klass), les tableaux en ont un de plus qui occupent toujours
4 bytes
en longueur, tout commesize
unint
.la source
La longueur du mot clé agit comme une donnée déposée définie. Lors de l'utilisation dans un tableau, nous pouvons l'utiliser pour accéder au nombre d'éléments dans un tableau. Concernant String [], nous pouvons invoquer la méthode length () définie dans la classe String. En ce qui concerne ArrayList, nous pouvons utiliser la méthode size () définie dans ArrayList. Notez que lors de la création d'une liste de tableaux avec ArrayList <> (capacité), la taille initiale () de cette liste de tableaux est nulle car il n'y a pas d'élément.
la source