数组的长度属性在哪里定义?

我们可以使用其公有方法size()来确定ArrayList<E>的长度

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

同样,我们可以使用length属性来确定Array对象的length

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

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

数组是java中的特殊对象,它们有一个名为length的简单属性,它是final

没有一个数组的“类定义”(你不能在任何.class文件中找到它),它们是语言本身的一部分。

10.7。 数组成员

数组类型的成员是以下所有内容:

  • public final字段length ,其中包含数组的组件数。 length可能是正数或零。
  • public方法clone ,它覆盖Object类中相同名称的方法,并不引发检查异常。 数组类型T[]clone方法的返回类型是T[]

    多维数组的克隆很浅,也就是说它只创建一个新的数组。 子阵是共享的。

  • Object类继承的所有成员; Object的唯一不被继承的方法是它的clone方法。

资源:

  • JLS – 阵列

它基本上是“特殊的”,有自己的字节码指令: 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)); 

不幸的是,具有公共最终字段length的每个数组类型的JLS描述有点误导:(

它在Java语言规范中定义:

数组类型的成员是以下所有内容:

  • public final字段length ,其中包含数组的组件数。 length可能是正数或零。

由于数组的数量是无限的(对于每个类都有一个对应的数组类型,并且有多维数组),所以它们不能在类文件中实现。 JVM必须立即执行。

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

公共final字段长度,其中包含数组的组件数

并不完全正确。

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

阵列内存分配

例:

 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 

然而, ArrayList.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 

它是public 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

关键字长度就像定义的数据字段一样。 在数组中使用时,我们可以使用它来访问数组中的元素。 关于String [],我们可以调用String类中定义的length()方法。 关于ArrayList,我们可以使用ArrayList中定义的size()方法。 请注意,使用ArrayList <>(容量)创建数组列表时,由于没有元素,此数组列表的初始大小()为零。