我想知道Java Array的length
的实现。我知道使用arrayName.length
为我们提供了数组中元素的数量,但是想知道这是一个方法/函数还是它只是数组的一个数据成员?在Java数组中如何实现长度?
我想它必须是数据成员,因为我们在调用它时不使用括号()
。但如果它是一个数据成员,这个length
的值是什么/什么时候分配/计算出来的?
我想知道Java Array的length
的实现。我知道使用arrayName.length
为我们提供了数组中元素的数量,但是想知道这是一个方法/函数还是它只是数组的一个数据成员?在Java数组中如何实现长度?
我想它必须是数据成员,因为我们在调用它时不使用括号()
。但如果它是一个数据成员,这个length
的值是什么/什么时候分配/计算出来的?
根据Java语言规范(特别§10.7 Array Members)它是一个场:
- 的
public
final
字段length
,其中包含(所述阵列的组件的数目的长度可以是正的或零)。
内部价值应该是介于存储在对象头,但是这是一个实现细节,并依赖于具体的JVM实现。
热点VM(一个在流行的Oracle(以前称为Sun)JRE/JDK)stores the size in the object-header:
[...]阵列具有第三首标字段中,阵列的大小。
我相信它只是一个财产,因为你作为一个财产访问它。
String[] s = new String[]{"abc","def","ghi"}
System.out.println(s.length)
回报3
如果它是一个方法,那么你会打电话s.length()
吧?
在技术上它甚至不是字段,因为JVM指令不是'GETFIELD'(但是ARRAYLENGTH),在同一个方面类可以被认为是数据成员(也存储在对象头部,甚至是指针的一部分) – bestsss 2011-05-10 12:52:50
@ bestsss:这在技术上可能是正确的,但我不知道JVM指令是否正确回答此问题的抽象级别。 JLS称“长度”既是一个成员也是一个领域。 http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#64347 – 2011-05-10 12:58:43
从*语言*的角度来看,它显然是一个领域:其行为与所有其他的“公共最终”领域。 – 2011-05-10 13:00:44
是的,它应该是一个字段。我认为这个值是在创建阵列时分配的(创建时必须选择阵列的长度,例如:int[] a = new int[5];
)。
从JLS:
阵列的长度可作为 最终实例变量长度
和:
一旦创建一个数组对象,其 长度从不改变。为了使数组 变量指的是一个不同长度的数组, 不同数组的引用必须被赋值为 这个变量。
并且数组在JVM中实现。您可能需要查看VM Spec了解更多信息。
这是数组类型的public final
字段。您可以参考下面的文档:
http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.7
Java中的每个阵列被视为一个对象。所述public final length
是包含所述阵列的组件的数量(length
可以是正的或零)
如果你有已知类型的阵列或是对象的一个子类[]可以先投阵列的data member
。
Object array = new ????[n];
Object[] array2 = (Object[]) array;
System.out.println(array2.length);
或
Object array = new char[n];
char[] array2 = (char[]) array;
System.out.println(array2.length);
不过,如果你不知道它是你可以使用Array.getLength(对象)是什么类型的磁盘阵列;
System.out.println(Array.getLength(new boolean[4]);
System.out.println(Array.getLength(new int[5]);
System.out.println(Array.getLength(new String[6]);
与C++数组类似,Java数组具有固定长度,在初始化之后,您无法更改它。但是,像类模板向量 - vector <T>
- 在C++中,您可以使用Java类ArrayList
,它比Java数组具有更多实用程序。
任何地方?甚至没有在JLS中?它在语法上是数组对象的成员变量,尽管你不能分配给它。 – Ingo 2011-05-10 12:44:32
JLS .. JLS就是答案。 – 2017-12-14 06:32:16