静态数组如何存储在 Java 内存中?

2022-09-02 11:55:42

因此,在像C这样的语言中,内存分为5个不同的部分:操作系统内核,文本段,静态内存,动态内存和堆栈。像这样:

Memory Layout

如果我们在C中声明了一个静态数组,你必须事先指定它的大小,然后它将永远固定。该程序将为数组分配足够的内存,并按预期将其粘贴到静态数据段中。

但是我注意到,在Java中,你可以做这样的事情:

public class Test {
        static int[] a = new int[1];

        public static void main( String[] args ) {
                a = new int[2];
        }
} 

一切都会像你期望的那样工作。我的问题是,为什么这在Java中工作?

编辑:所以大家的共识是,Java中的a的行为更类似于C中的an。因此,作为后续问题,有没有办法在Java中的静态内存中分配数组(如果不是,为什么不呢)?这难道不能提供对此类数组的更快访问吗?EDIT2: ^ 这是现在一个新问题:静态类变量存储在内存中的位置?int[]int*


答案 1

的值只是对对象的引用。数组创建表达式 () 创建一个大小合适的对象,并分配对 的引用。anew int[2]a

请注意,在Java中与在C中相当独立。在Java中,它只是意味着“与类型相关,而不是与类型的任何特定实例相关”。staticstatic


答案 2

在java中,任何时候你使用这个词,该对象的内存都会在堆上分配,并返回一个引用。对于数组也是如此。只是对 的引用。当你这样做时,一个新的数组被分配并指向 a。旧阵列将在需要时进行垃圾回收。newint[] anew int[1]new int[2]