[英]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.