web-dev-qa-db-fra.com

Où est définie la propriété length de array?

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?

256
NINCOMPOOP

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 publicfinallength, qui contient le nombre de composants du tableau. length peut être positif ou nul.
  • La méthode publicclone, qui remplace la méthode du même nom dans la classe Object et ne lève 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 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 de Object qui n'est pas héritée est sa méthode clone.

Ressources:

247
Colin Hebert

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 :(

114
Jon Skeet

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 finallength, 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.

18
Michael Borgwardt

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. 

Array Memory Allocation

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
15
nem035

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

5
Massimiliano Peluso

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.

0
Xiaogang

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.

0
Eugene