Où est la propriété length du tableau définie?

Nous pouvons déterminer la longueur d’une ArrayList utilisant sa méthode publique size() , comme

 ArrayList arr = new ArrayList(10); int size = arr.size(); 

De même, nous pouvons déterminer la longueur d’un object Array utilisant la propriété length

 Ssortingng[] str = new Ssortingng[10]; int size = str.length; 

Considérant 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 objects spéciaux dans java, ils ont un atsortingbut simple nommé length qui est final .

Il n’y a pas de “définition de classe” d’un tableau (vous ne le trouvez pas dans un fichier .class), ils font partie du langage lui-même.

10.7. Membres du tableau

Les membres d’un type de tableau sont tous les suivants:

  • La length champ final public , qui contient le nombre de composants du tableau. length peut être positive ou nulle.
  • La méthode public clone , qui remplace la méthode du même nom dans la classe Object et ne génère aucune exception vérifiée. Le type de retour de la méthode clone d’un type de tableau T[] est T[] .

    Un clone d’un tableau multidimensionnel est peu profond, c’est-à-dire 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 de Object non héritée est sa méthode de clone .

Ressources:

  • JLS – Tableaux

Il est fondamentalement “spécial”, avec sa propre instruction bytecode: arraylength . Donc, cette méthode:

 public static void main(Ssortingng[] args) { int x = args.length; } 

est compilé en bytecode comme ceci:

 public static void main(java.lang.Ssortingng[]); Code: 0: aload_0 1: arraylength 2: istore_1 3: return 

Donc, il n’est pas consulté 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, cela échoue:

 // Fails... Field field = args.getClass().getField("length"); System.out.println(field.get(args)); 

Donc, malheureusement, la description JLS de chaque type de tableau ayant une length champ finale publique 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:

  • La length champ public final , qui contient le nombre de composants du tableau. length peut être positive ou nulle.

Comme il y a un nombre illimité de types de tableaux (pour chaque classe, il y a un type de tableau correspondant, puis des tableaux multidimensionnels), ils ne peuvent pas être implémentés dans un fichier de classe; la JVM 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 recherchais quelque chose en rapport avec cette question, alors quand je l’ai rencontré, j’ai remarqué que la ou les définitions fournies 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 de places disponibles pour placer un composant, pas le nombre de composants présents dans le tableau. Donc, il représente la mémoire totale disponible allouée à ce tableau, et non la quantité de cette mémoire qui est remplie.

Allocation de mémoire de tableau

Exemple:

 static class StuffClass { int stuff; StuffClass(int stuff) { this.stuff = stuff; } } public static void main(Ssortingng[] args) { int[] test = new int[5]; test[0] = 2; test[1] = 33; System.out.println("Length of int[]:\t" + test.length); Ssortingng[] test2 = new Ssortingng[5]; test2[0] = "2"; test2[1] = "33"; System.out.println("Length of Ssortingng[]:\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 Ssortingng[]: 5 Length of StuffClass[]: 5 

Cependant, la propriété .size() de ArrayList indique le nombre d’éléments de la liste:

 ArrayList intsList = new ArrayList(); 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 un fichier de données défini. 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 Ssortingng [], nous pouvons appeler la méthode length () définie dans la classe Ssortingng. 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 <> (capacity), la taille initiale () de cette liste de tableaux est zéro car il n’y a pas d’élément.

Pour y répondre tel quel, où est cette propriété length de array ? Dans un en- Object header spécial.

Facile à voir via JOL

  int [] ints = new int[23]; System.out.println(ClassLayout.parseInstance(ints).toPrintable()); 

L’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 objects ont deux en-têtes (mark et klass), les tableaux ont un autre qui occupe toujours 4 bytes de longueur, car la size est un int .