Java---数组与数组的内存分配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miha_Singh/article/details/81416696

1.辨析数组变量和数组对象

代码示例:

int[] a;     //#1
a = new int[2];   //#2

上面一小段代码展示了什么是数组变量,什么是数组对象。在#1中声明了一个数组类型的变量a,这个时候a并未指向任何一段内存,编译器也为替a分配内存,这个a是未初始化的,在这里a就是一个数组变量。
数组变量是数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象,
而在#2中,通过new创建了一个长度为2的数组对象,并用a指向了这个对象。

2.数组的初始化

代码示例:

int[] a = new int[]{1,2,3,4,5};  //静态初始化
int[] b = new int[5];            //动态初始化

.静态初始化:初始化时由程序员显示地指定数组中每个元素的,由系统决定数组长度
动态初始化:初始化时只指定数组的长度,由系统为数组元素分配初始值

3.多维数组?

多维数组的概念并不鲜见,但是我们一般见到的多维数组就像一个规规矩矩的矩阵一样,有固定的行数,固定的列数,但是在java中,多维数组变的有点不一样了。先看一段代码:

//把a当做1维数组进行初始化,初始化为一个长度为4的数组
//a数组的数组元素类型为引用类型
a = new int[4][];

//把a当做一个一维数组,遍历a数组的每个数组元素
for(int i = 0;i < a.length; i++){
    System.out.println("a["+i+"]: "+ a[i]);
}

//初始化a数组的第一个元素
a[0] = new int[2];

//初始化a数组的第二个元素
a[1] = new int[3];

//访问a数组的第一个元素所指数组的第二个元素
a[0][1] = 6;

//访问a数组的第二个元素所指数组的第二个元素
a[1][1] = 6;

//a数组的第一个元素是一个一维数组,遍历这个数组
for(int i = 0;i < a[0].length;i++) {
    System.out.println("a[0]["+i+"]: "+a[0][i]);
}

//a数组的第二个元素是一个一维数组,遍历这个数组
for(int i = 0;i < a[1].length;i++) {
    System.out.println("a[1]["+i+"]: "+a[1][i]);
}

根据以上对数组变量以及数组对象的辨析来理解来理解以上的代码。
首先定义了一个数组变量a,指向了一个长度为4的数组对象,这个数组对象的元素类型是一维数组类型。先把a看做一个一维数组,那么a的每一个元素都是一个数组变量,都可以指向一个数组对象,也就是说一维数组a中的元素类型是一维数组即可,那么也就不必强求数组a中的元素都是长度相等的一维数组。
综上可以看出,在java中,一个二维数组可以看作是一个存储一维数组的数组,所存储的一维数组长度可以不同。

4.数组的内存分配

在java中,所有局部变量都存放在栈内存中,不管是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈区中。但引用类型所引用的对象则存放在堆内存中,堆内存中对象通常不允许直接访问,为了访问堆内存中的对象,通常只能通过引用变量。
则数组变量一般都存放在栈中,而这个数组变量所指向的数组对象则存放在堆内存中,从这我们可以看到数组变量有点类似于指针。

猜你喜欢

转载自blog.csdn.net/Miha_Singh/article/details/81416696