2011-05-10 112 views
37

我想知道Java Array的length的实现。我知道使用arrayName.length为我们提供了数组中元素的数量,但是想知道这是一个方法/函数还是它只是数组的一个数据成员?在Java数组中如何实现长度?

我想它必须是数据成员,因为我们在调用它时不使用括号()。但如果它是一个数据成员,这个length的值是什么/什么时候分配/计算出来的?

+0

任何地方?甚至没有在JLS中?它在语法上是数组对象的成员变量,尽管你不能分配给它。 – Ingo 2011-05-10 12:44:32

+0

JLS .. JLS就是答案。 – 2017-12-14 06:32:16

回答

39

根据Java语言规范(特别§10.7 Array Members)它是一个场:

  • publicfinal字段length,其中包含(所述阵列的组件的数目的长度可以是正的或零)。

内部价值应该是介于存储在对象头,但是这是一个实现细节,并依赖于具体的JVM实现。

热点VM(一个在流行的Oracle(以前称为Sun)JRE/JDK)stores the size in the object-header

[...]阵列具有第三首标字段中,阵列的大小。

+4

谢谢大家。随着你的有益答复(和一点点阅读),我发现“最终领域”可以设置在其他声明的地方(我曾经错误地认为他们只能在声明的同一时间被定义)。所以我猜Array类的ctor代码计算了元素的数量,并将这个值赋给'length'。 – 2011-05-10 14:19:18

+0

现在我们谈谈初学者:D – bestsss 2011-05-10 15:06:09

+0

很棒的作品!白皮书说普通对象有两个字对象头,但是我用Java-Object-Layout工具通过3个字对象头获得头信息。怎么了? – Chao 2016-08-22 13:31:28

0

我相信它只是一个财产,因为你作为一个财产访问它。

String[] s = new String[]{"abc","def","ghi"} 
System.out.println(s.length) 

回报3

如果它是一个方法,那么你会打电话s.length()吧?

17

你是对的,length是一个数据成员,而不是一个方法。

Arrays tutorial

在创建阵列时的阵列的长度被建立。创建后,其长度是固定的。

+8

在技术上它甚至不是字段,因为JVM指令不是'GETFIELD'(但是ARRAYLENGTH),在同一个方面类可以被认为是数据成员(也存储在对象头部,甚至是指针的一部分) – bestsss 2011-05-10 12:52:50

+2

@ bestsss:这在技术上可能是正确的,但我不知道JVM指令是否正确回答此问题的抽象级别。 JLS称“长度”既是一个成员也是一个领域。 http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#64347 – 2011-05-10 12:58:43

+1

从*语言*的角度来看,它显然是一个领域:其行为与所有其他的“公共最终”领域。 – 2011-05-10 13:00:44

1

是的,它应该是一个字段。我认为这个值是在创建阵列时分配的(创建时必须选择阵列的长度,例如:int[] a = new int[5];)。

0

从JLS:

阵列的长度可作为 最终实例变量长度

和:

一旦创建一个数组对象,其 长度从不改变。为了使数组 变量指的是一个不同长度的数组, 不同数组的引用必须被赋值为 这个变量。

并且数组在JVM中实现。您可能需要查看VM Spec了解更多信息。

0

Java中的每个阵列被视为一个对象。所述public final length是包含所述阵列的组件的数量(length可以是正的或零)

4

如果你有已知类型的阵列或是对象的一个​​子类[]可以先投阵列的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]); 
0

与C++数组类似,Java数组具有固定长度,在初始化之后,您无法更改它。但是,像类模板向量 - vector <T> - 在C++中,您可以使用Java类ArrayList,它比Java数组具有更多实用程序。