我们可以使用公开方法ArrayList<E>
来确定size()
的长度,例如
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
同样,我们可以使用Array
属性
length
对象的长度
String[] str = new String[10];
int size = str.length;
size()
类的ArrayList
方法是在ArrayList
类中定义的,length
属性Array
定义在哪里?
答案 0 :(得分:247)
数组是java中的特殊对象,它们有一个名为length
的简单属性final
。
没有数组的“类定义”(你无法在任何.class文件中找到它),它们是语言本身的一部分。
10.7。数组成员
数组类型的成员是以下所有成员:
public
final
字段length
,其中包含数组的组件数。length
可能是正数或零。
public
方法clone
,它会覆盖类Object
中相同名称的方法,并且不会抛出任何已检查的异常。数组类型clone
的{{1}}方法的返回类型为T[]
。多维数组的克隆很浅,也就是说它只创建一个新数组。子阵列是共享的。
- 所有成员都继承自班级
T[]
;唯一没有继承的Object
方法是Object
方法。
<强>资源:强>
答案 1 :(得分:114)
它&#34;特别&#34;基本上,使用自己的字节码指令: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描述都有些误导:(
答案 2 :(得分:18)
它在Java language specification:
中定义数组类型的成员是以下所有成员:
public final
字段length
,其中包含数组的组件数。length
可能是正数或零。
由于存在无限数量的数组类型(对于每个类都有相应的数组类型,然后有多维数组),它们不能在类文件中实现; JVM必须即时完成。
答案 3 :(得分:15)
即使这不是问题的直接答案,但它是对.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()
的{{1}}属性确实提供了列表中元素的数量:
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());
答案 4 :(得分:5)
它是公共最终字段,其中包含数组的组件数(长度可能为正或零)
因此,数组具有与以下类相同的公共字段和方法:
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
答案 5 :(得分:0)
要按原样回答,数组定义的长度属性在哪里?在特殊的Object header
。
通过JOL
轻松查看 int [] ints = new int[23];
System.out.println(ClassLayout.parseInstance(ints).toPrintable());
此输出中的一行将是:
OFFSET SIZE TYPE DESCRIPTION
16 4 (object header) 17 00 00 00 (00010111 00000000 00000000 00000000) (23)
通常,对象有两个标题(mark和klass),数组的长度总是4 bytes
,size
是int
。
答案 6 :(得分:-1)
关键字长度的作用类似于定义的数据字段。在数组中使用时,我们可以使用它来访问数组中的元素数量。关于String [],我们可以调用String类中定义的length()方法。关于ArrayList,我们可以使用ArrayList中定义的size()方法。请注意,在使用ArrayList&lt;&gt;(capacity)创建数组列表时,此数组列表的初始大小()为零,因为没有元素。