2012-08-05 105 views
0

假設有一個數組聲明:這個聲明在Java中意味着什麼?

int [] a = new int[3]; 

我讀了一本書,說我們需要在運行時明確創建數組的原因是因爲我們無法知道多少空間保留在編譯時數組。所以,在上面的例子中,我們不知道我們需要保留底層java平臺的int大小的3倍嗎?

+0

你可以參考一下什麼書? – 2012-08-05 23:11:07

回答

2

在這本書中,它可能會說有些情況下,在編譯時您不知道數組的大小(例如:當您向用戶詢問一組數字時,您不知道有多少他將插入數字)。

在你的例子中(int [] a = new int[3])你顯然知道編譯時數組的大小;它是3.

+1

因此,如果我們知道數組的大小,就像在這種情況下一樣,它會在編譯時分配正確嗎? – Phoenix 2012-08-05 23:20:30

+0

我upvoted你的評論,意思是:是 – Razvan 2012-08-05 23:24:01

0

是的。你的正確。

3 * sizeOf(int) + array overhead. 

您正在保留那麼多的內存,然後將一個指針移到變量a的第一個位置。然後,可以根據存儲的位置和大小找出如何索引數組。

+1

實際上一個int元素有三個元素可能需要*至少* 24字節(8字節的對象開銷,4字節的長度和12字節的數據本身)。 – 2012-08-05 23:13:24

+0

@JonSkeet感謝您的分手。我沒有想到這個細節。我需要了解開銷是如何計算的。它總是一個靜態的8字節? – 2012-08-05 23:18:00

+0

它取決於JVM,可能取決於體系結構(32位或64位)。哦,並且JVM也可能決定根據實現細節對數據進行不同的調整。 – 2012-08-05 23:18:44

5

因此,在這種情況下,我們不知道我們需要保留底層java平臺的int大小的3倍嗎?

實際上,稍微多一點 - 因爲數組是帶有類引用的對象,以及長度。

但是,是的,在這種情況下您恰好提前知道大小。但是,Java也可以讓你寫:

int[] a = new int[getLengthFromMethod()]; 

...在這種情況下沒有,內存量不會在編譯時已知的。這種靈活性使得使用數組比在編譯時必須知道大小更簡單。 (想象一下,例如,試圖使ArrayList以其他方式工作)。

但請記住,一般情況下,Java中的內存分配非常動態 - 它實際上只是事先已知的堆棧幀的大小,相對而言(因爲參考的大小可能因平臺而異)。全部對象分配在堆上,引用用於跟蹤它們。


好的,除了智能JVM中其有時能夠執行逃逸分析後分配的內聯。

-2

你確定你正在閱讀的書是關於Java?與C/C++不同,Java不存在這種困境 - 即使在編譯期間知道它們的大小,也總是在運行時分配數組。

0

在你的情況下,數組的大小是在方括號中3,號碼的size.CHeck這個星期教程關於www.codejava.co.uk陣列