我们可以使用数组列表的公共方法size()来确定数组列表<E>的长度,比如

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

类似地,我们可以使用length属性确定Array对象的长度

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

ArrayList的size()方法是在ArrayList类中定义的,那么Array的length属性是在哪里定义的呢?


当前回答

它在Java语言规范中定义:

数组类型的成员都是以下类型: 公共最终字段长度,它包含数组的组件数。长度可以为正或零。

由于数组类型的数量是无限的(每个类都有一个对应的数组类型,然后还有多维数组),它们不能在类文件中实现;JVM必须在运行中完成它。

其他回答

关键字长度就像定义的数据字段。在数组中使用时,可以使用它来访问数组中有多少元素。对于String[],我们可以调用String类中定义的length()方法。对于ArrayList,我们可以使用ArrayList中定义的size()方法。注意,当创建ArrayList<>(capacity)的数组列表时,该数组列表的初始size()为零,因为没有元素。

尽管这不是对问题的直接回答,但它是对.length vs .size()参数的补充。我正在研究与这个问题相关的东西,所以当我遇到它时,我注意到这里提供的定义

公共最终字段长度,它包含数组的组件数。

并不“完全”正确。

字段长度包含可放置组件的可用位置的数量,而不是数组中存在的组件的数量。所以它表示分配给数组的总可用内存,而不是内存被填满了多少。

例子:

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

输出:

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

然而,数组列表的.size()属性确实给出了列表中元素的数量:

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

输出:

List size:  0
List size:  1
List size:  2

它的公共final字段,包含数组的组件数量(长度可以为正或零)

因此,数组具有与以下类相同的公共字段和方法:

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

更多资料请浏览

10.7数组成员

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

它基本上是“特殊的”,有自己的字节码指令:arraylength。这个方法:

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

编译成字节码,如下所示:

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

所以它不像普通字段那样被访问。事实上,如果你试图把它当作一个正常的字段,就像这样,它会失败:

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

所以不幸的是,JLS对每个数组类型都有一个公共最终字段长度的描述有点误导人:(

它在Java语言规范中定义:

数组类型的成员都是以下类型: 公共最终字段长度,它包含数组的组件数。长度可以为正或零。

由于数组类型的数量是无限的(每个类都有一个对应的数组类型,然后还有多维数组),它们不能在类文件中实现;JVM必须在运行中完成它。