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

时间:2011-07-11 18:35:44

标签: java c arrays memory static

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

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中的int[]与C中的int*的行为更相似。所以作为后续问题,有没有办法在静态内存中分配数组Java(如果没有,为什么不呢)?这不会更快地访问这样的阵列吗? EDIT2:^现在这是一个新问题:Where are static class variables stored in memory?

7 个答案:

答案 0 :(得分:17)

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

请注意,Java中的static与C中的static完全分开。在Java中,它只表示“与类型相关而不是与该类型的任何特定实例相关”。

答案 1 :(得分:11)

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

我假设当你提到“静态内存”时,你指的是堆。在Java中,堆的用途与您提到的“静态数据段”类似。堆是大多数对象分配的地方,包括数组。另一方面,堆栈是放置仅在单个方法的生命期内使用的对象的位置。

答案 4 :(得分:2)

在Java中,您只是要求对类Test静态存储对数组的强类型引用。您可以更改a在运行时引用的内容,包括更改大小。这将是int*的静态存储的C等价物。

答案 5 :(得分:2)

在Java中,static变量作为类对象的一部分存在。可以将其视为类本身的实例变量。在您的示例中,a是一个引用变量,它引用某个数组(或者根本不引用数组,如果它是null),但是数组本身是分配的,因为所有数组都在Java中:off堆。

答案 6 :(得分:1)

Static在Java中有不同的含义。在Java中,当您将变量声明为static时,它是一个类变量而不是实例变量。