数组的长度属性在哪里定义?
我们可以使用其公有方法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;
ArrayList
的size()
方法是在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 <>(容量)创建数组列表时,由于没有元素,此数组列表的初始大小()为零。