2011-05-10 109 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數組具有更多實用程序。