Gdzie jest zdefiniowana właściwość długości tablicy?

Możemy określić długość {[2] } używając jego publicznej metody size(), Jak

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

Podobnie możemy określić długość obiektu Array za pomocą właściwości length

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

Podczas gdy size() metoda ArrayList jest zdefiniowana wewnątrz klasy ArrayList, gdzie jest TA length właściwość Array zdefiniowana?

 264
Author: Sнаđошƒаӽ, 2012-02-15

7 answers

Tablice są specjalnymi obiektami w Javie, mają prosty atrybut o nazwie length czyli final.

Nie ma "definicji klasy" tablicy (nie można jej znaleźć w żadnej .class file), są częścią samego języka.

10.7. Array Members

Członkowie typu tablicy są następujące:

  • The public final pole length, które zawiera liczbę składników tablicy. length może być dodatnia lub zerowa.
  • Metoda public clone, która nadpisuje metodę o tej samej nazwie w klasie Object i nie wyrzuca zaznaczonych WYJĄTKÓW. Zwracanym typem metody clone typu tablicy T[] jest T[].

    Klon wielowymiarowej tablicy jest płytki, co oznacza, że tworzy tylko jedną nową tablicę. Subarrays są wspólne.
  • Wszystkie elementy dziedziczone z klasy Object; jedyną metodą Object, która nie jest dziedziczona, jest jej metoda clone.

Zasoby:

 254
Author: Colin Hebert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 10:20:23

Jest w zasadzie" specjalny", z własną instrukcją bajtową: arraylength. Więc ta metoda:

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

Jest skompilowany do kodu bajtowego w następujący sposób:

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

Więc nie ma dostępu, jakby było normalnym polem. W rzeczywistości, jeśli spróbujesz uzyskać to tak, jakby było normalnym polem, jak to, to się nie powiedzie:

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

Więc niestety, opis JLS każdego typu tablicy posiadającego publiczne pole końcowe length jest nieco mylący :(

 118
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 17:15:40

Jest zdefiniowany w specyfikacji języka Java :

Członkowie typu array są następujące:

  • pole public final length, które zawiera liczbę składników tablicy. length może być dodatnia lub zerowa.

Ponieważ istnieje nieograniczona liczba typów tablic (dla każdej klasy istnieje odpowiedni typ tablicy, a wtedy istnieją tablice wielowymiarowe), nie mogą one być zaimplementowane w klasie plik; JVM musi to robić w locie.

 19
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 03:31:59

Chociaż nie jest to bezpośrednia odpowiedź na pytanie, jest to dodatek do argumentu .length vs .size(). BadaĹ 'em coĹ" zwiÄ ... zanego z tym pytaniem wiÄ ™ c kiedy na to natknÄ ... Ĺ 'em siÄ ™ zauwaĺľyĺ' em, ĹĽe definicja(y) podana tutaj

Publiczna końcowa długość pola, która zawiera liczbę składników tablicy.

Nie jest "dokładnie" poprawne.

Długość pola zawiera liczbę wolne miejsca na umieść komponent, a nie liczbę komponentów obecnych w tablicy. Reprezentuje więc całkowitą dostępną pamięć przydzieloną do tej tablicy, a nie Ilość zapełnionej pamięci.

Alokacja Pamięci Tablicy

Przykład:

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

Wyjście:

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

Jednak właściwość .size() ArrayList daje liczbę elementów na liście:

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

Wyjście:

List size:  0
List size:  1
List size:  2
 15
Author: nem035,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-16 10:08:06

Jest to Publiczne pole końcowe, które zawiera liczbę składników tablicy (długość może być dodatnia lub zerowa)

Tablica ma zatem te same publiczne pola i metody, co następująca klasa:

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

Więcej informacji na

10.7 Array Members

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

 5
Author: Massimiliano Peluso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 17:31:40

Aby odpowiedzieć tak jak jest, gdzie jest ta właściwość długości tablicy zdefiniowana? W specjalnym Object header.

Easy to see via JOL

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

Jedna z linii tego wyjścia będzie brzmiała:

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

Zazwyczaj obiekty mają dwa nagłówki (mark i klass), tablice mają jeszcze jeden, który zawsze zajmuje 4 bytes w długości, ponieważ size jest int.

 0
Author: Eugene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 10:02:23

Długość słowa kluczowego działa jak zdefiniowany plik danych. Używając tablicy, możemy jej użyć do uzyskania dostępu do ilości elementów w tablicy. Jeśli chodzi o String [], możemy wywołać metodę length () zdefiniowaną w klasie String. W odniesieniu do ArrayList możemy użyć metody size () zdefiniowanej w ArrayList. Zauważ, że podczas tworzenia listy tablic z ArrayList(capacity), początkowa wartość size () tej listy tablic wynosi zero, ponieważ nie ma żadnego elementu.

 -1
Author: Xiaogang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-19 06:08:18