簡體   English   中英

靜態數組如何存儲在Java內存中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM