静态数组如何存储在Java内存中?
因此,在像C这样的语言中,内存被分成5个不同的部分:操作系统内核、文本段、静态内存、动态内存和堆栈。大概是这样的:静态数组如何存储在Java内存中?,java,c,arrays,memory,static,Java,C,Arrays,Memory,Static,因此,在像C这样的语言中,内存被分成5个不同的部分:操作系统内核、文本段、静态内存、动态内存和堆栈。大概是这样的: public class Test { static int[] a = new int[1]; public static void main( String[] args ) { a = new int[2]; } } 如果我们在C语言中声明了一个静态数组,那么您必须事先指定它的大小,然后才
public class Test {
static int[] a = new int[1];
public static void main( String[] args ) {
a = new int[2];
}
}
如果我们在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
指定一个引用
请注意,Java中的
static
与C中的static
完全不同。在Java中,它只是表示“与类型相关,而不是与类型的任何特定实例相关”。您正在创建一个新数组,而不是修改旧数组。新数组将获得自己的空间,旧数组将被垃圾收集(只要没有其他人持有对它的引用)。在java中,无论何时使用单词new
,该对象的内存都会在堆上分配,并返回一个引用。对于阵列也是如此。int[]a
只是对newint[1]
的引用。当您执行新建int[2]
时,将分配一个新数组并将其指向。旧阵列将在需要时进行垃圾收集 在Java中,您只要求为类Test
静态存储对数组的强类型引用。您可以在运行时更改a
引用的内容,包括更改大小。这相当于Java中int*
的静态存储,而静态变量作为类对象的一部分存在。将其视为类本身的实例变量。在您的示例中,a
是一个引用变量,它引用某个数组(或者根本没有数组,如果它是null
),但是数组本身被分配,因为所有数组都在Java中:堆外。Static在Java中有不同的含义。在Java中,当您将一个变量声明为静态时,它是一个类变量而不是实例变量。我假设当您指的是“静态内存”时,您指的是堆。在Java中,堆的用途与您提到的“静态数据段”类似。堆是分配大多数对象(包括数组)的地方。另一方面,堆栈是放置仅在单个方法的生命周期内使用的对象的地方。+1,要更深入地了解C的static
与Java的static
相比,实际上所示的模型对于C甚至不是普遍适用的。对于您的普通桌面,它可能是适用的,但是C中的内存模型非常简单和慷慨。嵌入式系统上的C看起来会完全不同。@tskuzzy:你应该问你的后续问题作为另一个问题来消除下面答案的歧义。@sixlettervariables:谢谢,可以。我不相信“在像C这样的语言中,内存是分开的”。语言标准非常谨慎,没有规定任何内存实现细节。而且,你的图片只有三个命名的片段,但你声称有五个。@Kerrek SB:其实它本身并不是“分离”的。但肯定有不同的记忆区域。我不确定标准是怎么说的,但我认为大多数计算机遵循与所描述的类似的内存布局。“Reserved”=“OS Kernel”,我猜他们将图片中的文本段与静态数据段结合起来。