[英]How are static arrays stored in Java memory?
所以在像C這樣的語言中,內存分為5個不同的部分:OS內核,文本段,靜態內存,動態內存和堆棧。 像這樣的東西:
如果我們在C中聲明了一個靜態數組,那么你必須事先指定它的大小,然后才能永久修復它。 該程序將為陣列分配足夠的內存,並按預期將其粘貼在靜態數據段中。
但是我注意到在Java中,你可以這樣做:
public class Test {
static int[] a = new int[1];
public static void main( String[] args ) {
a = new int[2];
}
}
一切都會像你期望的那樣奏效。 我的問題是,為什么這在Java中有效?
編輯:所以共識是Java中的int[]
更像C中的int*
。因此作為后續問題,有沒有辦法在Java中的靜態內存中分配數組(如果沒有,為什么不呢) ? 這不會更快地訪問這樣的陣列嗎? EDIT2:^現在這是一個新問題: 靜態類變量存儲在內存中的哪個位置?
的值a
僅僅是對一個對象的引用。 數組創建表達式( new int[2]
生成大小合適的一個新對象,和基准分配給a
。
需要注意的是static
在Java中是相當獨立的,以static
的C.在Java它只是意味着“相關的類型,而不是類型的任何特定實例”。
在java中,只要你使用new
這個詞,就會在堆上分配該對象的內存並返回引用。 陣列也是如此。 int[] a
只是對new int[1]
的引用。 當你執行new int[2]
,會分配一個新數組並指向a。 舊數組將在需要時進行垃圾回收。
您正在創建一個新數組,而不是修改舊數組。 新數組將獲得自己的空間,舊數組將被垃圾收集(只要沒有其他人擁有對它的引用)。
我假設當你提到“靜態內存”時,你指的是堆。 在Java中,堆的用途與您提到的“靜態數據段”類似。 堆是大多數對象分配的地方,包括數組。 另一方面,堆棧是放置僅在單個方法的生命期間使用的對象的位置。
在Java中,您只是要求為類Test
靜態存儲對數組的強類型引用。 你可以改變什么a
是指在運行,其中包括改變大小 。 這將是C *相當於int*
的靜態存儲。
在Java中, static
變量作為類對象的一部分存在。 可以將其視為類本身的實例變量。 在您的示例中, a
是一個引用變量,它引用一些數組(或者根本沒有數組,如果它是null
),但是數組本身是在所有數組都在Java中的時候分配的:離開堆。
靜態在Java中有不同的含義。 在Java中,當您將變量聲明為static時,它是一個類變量而不是實例變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.