wake-up-neo.com

Wo ist die length-Eigenschaft des Arrays definiert?

Wir können die Länge eines ArrayList<E> mit seiner öffentlichen Methode size() bestimmen, wie

ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();

In ähnlicher Weise können wir die Länge eines Array-Objekts mithilfe der length-Eigenschaft bestimmen

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

Während die size()-Methode von ArrayList innerhalb der ArrayList-Klasse definiert ist, wo ist diese length-Eigenschaft von Array definiert?

256
NINCOMPOOP

Arrays sind spezielle Objekte in Java. Sie haben ein einfaches Attribut mit dem Namen length, das final ist.

Es gibt keine "Klassendefinition" eines Arrays (Sie können es in keiner .class-Datei finden), sie sind Teil der Sprache selbst.

10,7. Array-Mitglieder

Die Mitglieder eines Array-Typs sind folgende:

  • Das Feld publicfinallength, das die Anzahl der Komponenten des Arrays enthält. length kann positiv oder null sein.
  • Die public-Methode clone, die die gleichnamige Methode in der Klasse Object überschreibt und keine geprüften Ausnahmen auslöst. Der Rückgabetyp der clone-Methode eines Array-Typs T[] ist T[].

    Ein Klon eines mehrdimensionalen Arrays ist flach, dh er erstellt nur ein neues Array. Subarrays werden gemeinsam genutzt.

  • Alle Mitglieder der Klasse Object; Die einzige Methode von Object, die nicht vererbt wird, ist die clone-Methode.

Ressourcen:

247
Colin Hebert

Es ist im Grunde "speziell", mit einer eigenen Bytecode-Anweisung: arraylength. Also diese Methode:

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

wird wie folgt in Bytecode kompiliert:

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

Es wird also nicht auf ein normales Feld zugegriffen. Wenn Sie versuchen, es wie ein normales Feld zu erhalten, schlägt dies fehl:

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

Leider ist die JLS-Beschreibung jedes Feldtyps mit einem öffentlichen abschließenden Feld length etwas irreführend :(

114
Jon Skeet

Es ist in der Java-Sprachspezifikation definiert :

Die Mitglieder eines Array-Typs sind folgende:

  • Das public final-Feld length, das die Anzahl der Komponenten des Arrays enthält. length kann positiv oder null sein.

Da es eine unbegrenzte Anzahl von Arraytypen gibt (für jede Klasse gibt es einen entsprechenden Arraytyp und then gibt es mehrdimensionale Arrays), können sie nicht in einer Klassendatei implementiert werden. Die JVM muss es im laufenden Betrieb tun.

18

Obwohl dies keine direkte Antwort auf die Frage ist, ist es eine Ergänzung des Arguments .length vs .size(). Ich recherchierte etwas im Zusammenhang mit dieser Frage. Als ich darauf stieß, fiel mir auf, dass die Definitionen hier angegeben sind

Die öffentliche endgültige Feldlänge, die die Anzahl der Komponenten des Arrays enthält. 

ist nicht "genau" richtig.

Die Feldlänge enthält die Anzahl vonverfügbaren Stellen, um eine Komponente zu platzieren, nicht die Anzahl der im Array vorhandenen Komponenten. Es stellt also den gesamten verfügbaren Speicher dar, der diesem Array zugewiesen ist, und nicht, wie viel von diesem Speicher belegt ist. 

Array Memory Allocation

Beispiel:

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);         
}

Ausgabe:

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

Die .size()-Eigenschaft der ArrayList gibt jedoch die Anzahl der Elemente in der Liste an:

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());

Ausgabe:

List size:  0
List size:  1
List size:  2
15
nem035

es ist ein öffentliches abschließendes Feld, das die Anzahl der Komponenten des Arrays enthält (Länge kann positiv oder Null sein)

Ein Array hat also die gleichen öffentlichen Felder und Methoden wie die folgende Klasse:

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());
        }
    }
}

mehr Infos unter 

10.7 Array-Mitglieder

http://Java.Sun.com/docs/books/jls/second_edition/html/arrays.doc.html

5

Die Schlüsselwortlänge verhält sich wie ein definiertes Datenfeld. Bei Verwendung in einem Array können wir darauf zugreifen, wie viele Elemente in einem Array vorhanden sind. In Bezug auf String [] können wir die in String-Klasse definierte length () -Methode aufrufen. In Bezug auf ArrayList können wir die in ArrayList definierte size () -Methode verwenden. Beachten Sie, dass beim Erstellen einer Array-Liste mit ArrayList <> (Kapazität) die anfängliche Größe () dieser Array-Liste Null ist, da kein Element vorhanden ist.

0
Xiaogang

Um es so zu beantworten, wie es ist: wo ist diese length-Eigenschaft von array definiert? In einem speziellen Object header.

Leicht zu sehen über JOL

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

Eine der Zeilen dieser Ausgabe wird sein:

OFFSET  SIZE      TYPE DESCRIPTION
16       4        (object header)   17 00 00 00 (00010111 00000000 00000000 00000000) (23)

Normalerweise haben Objekte zwei Header (mark und klass), Arrays haben einen weiteren, der immer 4 bytes in der Länge belegt, da size eine int ist.

0
Eugene