java中数组有2中情况:基本类型(如:int,char等等)或者引用(或者叫指针)。

当使用”new” 创建一个对象的时候,内存是分配在堆上同时返回一个索引。当数组是对象的时候,对于它来说也是一样的。

1. 一维数组

1
int arr[] = new int[3];

int[] 数组只是有3个整数的索引。如果你创建10个整数,它也是相同的-分配一个数组然后返回索引。

 one dimension array

2. 二维数组

二维数组又是什么样的呢?实际上,在java中我们只能有一维数组。2D数组都是基于一维数组的。

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

 Arrayin Memory

多维数组使用相同的规则。

3.在内存中他们位于何处?

在java中Arrays 和对象一样,所以一个对象在内存中如起来像什么,那么数组也一样。

我们知道JVM Run-Time Data Areas包括堆、JVM栈和别的。下面是一个简单的例子,让我们来看看数组的索引是怎么存储的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
int x;
int y;
}
...
public void m1() {
int i = 0;
m2();
}
public void m2() {
A a = new A();
}
...

根据上面的申明,我们调用m1() 来看看发生了什么:

1.当m1() 调用时,一个新的帧(Frame-1)推入栈,同时Frame-1中创建了局部变量等。
2.然后m1中的m2()被调用,一个新的帧(Frame-2)被压入栈。在m2中,类A的一个对象在堆中被创建同时索引变量被压入Frame-2。现在在这个点,栈和堆类似如下:

 Array in Memory

数组和对象是很像的,所以可以直截了当的定位数组在内存的分配。

参考文档