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

tsk*_*zzy 19 c java memory arrays static

所以在像C这样的语言中,内存分为5个不同的部分:OS内核,文本段,静态内存,动态内存和堆栈.像这样的东西:

内存布局

如果我们在C中声明了一个静态数组,那么你必须事先指定它的大小,然后才能永久修复它.该程序将为阵列分配足够的内存,并按预期将其粘贴在静态数据段中.

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

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

        public static void main( String[] args ) {
                a = new int[2];
        }
} 
Run Code Online (Sandbox Code Playgroud)

一切都会像你期望的那样奏效.我的问题是,为什么这在Java中有效?

编辑:所以共识是int[]Java中的行为int*与C中的行为更相似.所以作为后续问题,有没有办法在Java中在静态内存中分配数组(如果没有,为什么不呢)?这不会更快地访问这样的阵列吗?EDIT2:^现在这是一个新问题:静态类变量存储在内存中的哪个位置?

Jon*_*eet 17

a只是对象的引用.数组创建表达式(new int[2])创建一个大小合适的对象,并为其指定引用a.

请注意,static在Java中与staticC 语言是完全分开的.在Java中,它只是表示"与类型相关而不是与类型的任何特定实例相关".


Ami*_*far 11

在java中,只要您使用该单词new,就会在堆上分配该对象的内存并返回引用.阵列也是如此.这int[] a只是参考new int[1].执行此操作时new int[2],将分配一个新数组并指向a.旧数组将在需要时进行垃圾回收.


Mat*_*ard 6

您正在创建一个新数组,而不是修改旧数组.新数组将获得自己的空间,旧数组将被垃圾收集(只要没有其他人拥有对它的引用).