Java 数组在内存中是什么样子的?
25
08 月

Java 数组在内存中是什么样子的?

在Java中数组存储两者之一:基本类型值(int, char, …)或引用(又名指针)。

当使用”new”来创建新对象时,内存在堆上分配空间,并返回一个引用。由于数组是对象,也是这么运作的。

1. 一维数组

int arr[] = new int[3];

这里的 int[] arr 是一个包含三个整数的数组的引用。如果创建一个10个对象的数组,还是一样分配空间并返回引用。

one-dimension-array-in-java

2. 二维数组

那二维数组是怎样的呢?事实上,在Java中只存在一维数组,二维数组只是一维数组,该数组的每一个元素也是一个数组。

int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];

Array-in-Memory-Java

多维数组规则也相同。

3. 他们在内存中存放何处呢?

数组也是Java对象,所以一个数组和其他对象存放一致。

我们知道, JVM运行时数据区域包括堆(heap),栈(JVM stack)和其他。下面通过一个简单的例子,来分析数组和其引用的存储位置。

class A {
	int x;
	int y;
}
 
...
 
public void m1() {
	int i = 0;
	m2();
}
 
public void m2() {
	A a = new A();
}
 
...

如上面的声明,我们调用m1(),看看会发生什么:

  • 当m1被调用,一个新的帧(Frame-1)被压入栈,同时在Frame-1中创建局部变量i
  • 然后在m1中调用m2,另一个新的帧(Frame-2)被压入栈。在m2中,在堆中新建class A的一个对象,并在Frame-2中存放对应的引用。

至此,栈和堆如下所示:

Java-array-in-memory

数组和对象一致,其在内存中的存放如上所讲述。