繁体   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