Nous pouvons déterminer la longueur d'un ArrayList<E>
en 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 objet Array
à l'aide de la propriété length
String[] str = new String[10];
int size = str.length;
Alors que la méthode size()
de ArrayList
est définie dans la classe ArrayList
, où est définie cette propriété length
de Array
?
Les tableaux sont des objets spéciaux en Java, ils ont un attribut simple nommé length
qui est final
.
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 même.
10.7. Membres du tableau
Les membres d'un type de tableau sont tous les suivants:
- Le champ
public
final
length
, qui contient le nombre de composants du tableau.length
peut être positif ou nul.La méthode
public
clone
, qui remplace la méthode du même nom dans la classeObject
et ne lève aucune exception vérifiée. Le type de retour de la méthodeclone
d'un type de tableauT[]
estT[]
.Un clone d'un tableau multidimensionnel est superficiel, ce qui signifie qu'il ne crée qu'un seul nouveau tableau. Les sous-réseaux sont partagés.
- Tous les membres hérités de la classe
Object
; la seule méthode deObject
qui n'est pas héritée est sa méthodeclone
.
Ressources:
C'est «spécial» en gros, avec sa propre instruction de code intermédiaire: arraylength
. Donc cette méthode:
public static void main(String[] args) {
int x = args.length;
}
est compilé en bytecode comme ceci:
public static void main(Java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: istore_1
3: return
Donc, on n'y accède pas 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 cela, il échouera:
// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));
Donc, malheureusement, la description JLS de chaque type de tableau ayant un champ final public length
est quelque peu trompeuse :(
Il est défini dans la spécification du langage Java :
Les membres d'un type de tableau sont tous les suivants:
- Le champ
public final
length
, qui contient le nombre de composants du tableau.length
peut être positif ou nul.
Comme il existe un nombre illimité de types de tableaux (pour chaque classe, il existe un type de tableau et puis, il existe des tableaux multidimensionnels), ils ne peuvent pas être implémentés dans un fichier de classe; la machine virtuelle doit le faire à la volée.
Même s'il ne s'agit pas d'une réponse directe à la question, il s'agit d'un ajout à l'argument .length
vs .size()
. Je faisais des recherches sur quelque chose en rapport avec cette question, alors quand je l’ai trouvée, j’ai remarqué que la ou les définitions données ici
La longueur du champ final public, qui contient le nombre de composants du tableau .
n'est pas "exactement" correct.
La longueur du champ contient le nombre deplaces disponiblespour mettre un composant, pas le nombre de composants présents dans le tableau. Cela représente donc la quantité totale de mémoire disponible allouée à ce tableau, et non la quantité de mémoire remplie.
Exemple:
static class StuffClass {
int stuff;
StuffClass(int stuff) {
this.stuff = stuff;
}
}
public static void main(String[] args) {
int[] test = new int[5];
test[0] = 2;
test[1] = 33;
System.out.println("Length of int[]:\t" + test.length);
String[] test2 = new String[5];
test2[0] = "2";
test2[1] = "33";
System.out.println("Length of String[]:\t" + test2.length);
StuffClass[] test3 = new StuffClass[5];
test3[0] = new StuffClass(2);
test3[1] = new StuffClass(33);
System.out.println("Length of StuffClass[]:\t" + test3.length);
}
Sortie:
Length of int[]: 5
Length of String[]: 5
Length of StuffClass[]: 5
Cependant, la propriété .size()
de la ArrayList
donne le nombre d'éléments de la liste:
ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());
Sortie:
List size: 0
List size: 1
List size: 2
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:
class A implements Cloneable, Java.io.Serializable {
public final int length = X;
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
plus d'infos sur
10.7 Membres du tableau
http://Java.Sun.com/docs/books/jls/second_edition/html/arrays.doc.html
La longueur du mot clé agit comme une donnée définie. Lors de l'utilisation dans un tableau, nous pouvons l'utiliser pour accéder au nombre d'éléments d'un tableau. En ce qui concerne 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 est de zéro car il n'y a aucun élément.
Pour y répondre tel quel, où est cette propriété de longueur du tableau défini? Dans un Object header
spécial.
Facile à voir via JOL
int [] ints = new int[23];
System.out.println(ClassLayout.parseInstance(ints).toPrintable());
Une des lignes de cette sortie va être:
OFFSET SIZE TYPE DESCRIPTION
16 4 (object header) 17 00 00 00 (00010111 00000000 00000000 00000000) (23)
Habituellement, les objets ont deux en-têtes (mark et klass), tandis que les tableaux en ont un qui occupe toujours 4 bytes
en longueur, car size
est une int
.