我想知道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