261 votes

Longueur du tableau de propriété

Nous pouvons déterminer la longueur d'un ArrayList<E> à l'aide de 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 à l'aide de l' length de la propriété

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

Alors que l' size() méthode de ArrayList est définie à l'intérieur de l' ArrayList classe , où est-ce que length de la propriété de l' Array ? Est-il mis en œuvre par la JVM ou faut-il résider dans n'importe quel Java API fichier de classe ?

248voto

Colin Hebert Points 40084

Les tableaux sont des objets spéciaux en java, ils ont un simple attribut nommé length qui final.

Il n'y a pas de "définition de la classe" d'un tableau (vous ne pouvez pas trouver dans n'importe .fichier de classe), ils sont une partie de la langue elle-même.

10.7. Les Membres Du Groupe

Les membres d'un type tableau sont les suivantes:

  • L' public final domaine length, qui contient le nombre de composants de la matrice. length peut être positif ou nul.
  • L' public méthode clone, ce qui remplace la méthode du même nom dans la classe Object et le jette pas vérifié exceptions. Le type de retour de la clone méthode de type tableau T[] est T[].

    Un clone d'un tableau multidimensionnel est peu profonde, c'est-à-dire qu'elle ne crée qu'un seul tableau. Des sous-tableaux sont partagés.

  • Tous les membres hérités de la classe Object; la seule méthode de Object qui n'est pas héréditaire, c'est son clone méthode.

Ressources:

114voto

Jon Skeet Points 692016

C'est "spécial" en fait, avec sa propre instruction bytecode: 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

Il n'est donc pas accessible, comme si c'était un champ normal. En effet, si vous essayez d'obtenir comme si c'était un champ normal, comme cela, il échoue:

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

Donc, malheureusement, la JLS description de chaque type de tableau ayant un public final champ length est quelque peu trompeur :(

18voto

Michael Borgwardt Points 181658

Il est défini dans le langage Java specification:

Les membres d'un type tableau sont les suivantes:

  • L' public final domaine length, qui contient le nombre de composants de la matrice. length peut être positif ou nul.

Car il y a un nombre illimité de types de tableau (pour chaque classe correspond un type de tableau, et puis il y a les tableaux multidimensionnels), ils ne peuvent être mis en œuvre dans un fichier de classe; la JVM doit le faire à la volée.

15voto

nem Points 2882

Même si ce n'est pas une réponse directe à la question, c'est un ajout à l' .length vs .size() argument. J'ai été la recherche de quelque chose lié à cette question, alors quand je suis tombée sur elle, j'ai remarqué que la définition(s) fourni ici

Le public final de la longueur de champ, qui contient le nombre de composants de la matrice.

n'est pas "exactement" à corriger.

La longueur de champ contient le nombre de places disponibles pour mettre un composant, pas le nombre de composants présents dans le tableau. Donc, il représente la totalité de la mémoire allouée à ce tableau, pas de combien de mémoire est remplie.

enter image description here

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("Lenght of int[]:\t" + test.length);

    String[] test2 = new String[5];
    test2[0] = "2";
    test2[1] = "33";    
    System.out.println("Lenght of String[]:\t" + test2.length);

    StuffClass[] test3 = new StuffClass[5];
    test3[0] = new StuffClass(2);
    test3[1] = new StuffClass(33);
    System.out.println("Lenght of StuffClass[]:\t" + test3.length);         
}

Sortie:

Lenght of int[]:        5
Lenght of String[]:     5
Lenght of StuffClass[]: 5

Cependant, l' .size() de la propriété de l' ArrayList donne le nombre d'éléments dans 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

5voto

Massimiliano Peluso Points 13357

elle est publique champ final , qui contient le nombre de composants de la matrice (la longueur peut être positif ou nul)

Un tableau a ainsi le même public, les champs et les méthodes de 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 au

10.7 Les Membres Du Groupe

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X