我们可以确定ArrayList<E>
使用其公共方法的长度size()
,例如
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
Run Code Online (Sandbox Code Playgroud)
类似地,我们可以Array
使用length
属性确定对象的长度
String[] str = new String[10];
int size = str.length;
Run Code Online (Sandbox Code Playgroud)
虽然size()
方法ArrayList
是在ArrayList
类中定义的,但是这个length
属性是在哪里Array
定义的?
Col*_*ert 248
数组是在Java中的特殊对象,他们有一个名为一个简单的属性length
是final
.
没有数组的"类定义"(你无法在任何.class文件中找到它),它们是语言本身的一部分.
10.7.数组成员
数组类型的成员是以下所有成员:
- 该
public
final
字段length
,包含数组的组件数.length
可能是正数或零.该
public
方法clone
在类中重写相同名称的方法,Object
并且不会抛出任何已检查的异常.clone
数组类型方法的返回类型T[]
是T[]
.多维数组的克隆很浅,也就是说它只创建一个新数组.子阵列是共享的.
- 所有成员都继承自班级
Object
; 唯一Object
没有继承的clone
方法是它的方法.
资源:
Jon*_*eet 114
它基本上是"特殊的",带有自己的字节码指令:arraylength
.所以这个方法:
public static void main(String[] args) {
int x = args.length;
}
Run Code Online (Sandbox Code Playgroud)
被编译成字节码,如下所示:
public static void main(java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: istore_1
3: return
Run Code Online (Sandbox Code Playgroud)
因此,它不像正常字段那样被访问.实际上,如果你试图让它好像是一个普通的字段,就像这样,它会失败:
// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));
Run Code Online (Sandbox Code Playgroud)
不幸的是,每个具有公共最终字段的数组类型的JLS描述length
都有些误导:(
nem*_*035 15
虽然这不是问题的直接答案,但它是.length
vs .size()
参数的补充.我正在研究与这个问题相关的事情,所以当我遇到它时,我注意到这里提供的定义
public 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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Length of int[]: 5
Length of String[]: 5
Length of StuffClass[]: 5
Run Code Online (Sandbox Code Playgroud)
但是,它的.size()
属性ArrayList
确实给出了列表中的元素数量:
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());
Run Code Online (Sandbox Code Playgroud)
输出:
List size: 0
List size: 1
List size: 2
Run Code Online (Sandbox Code Playgroud)
它是公共最终字段,包含数组的组件数(长度可以是正数或零)
因此,数组具有与以下类相同的公共字段和方法:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息
10.7阵列成员
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html