数组内存分配之堆、栈

时间:2021-06-14 02:22:51

首先看一下数组:

数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式:

格式1:数据类型[]  数组名;int[] a:定义一个int类型的数组a变量。 格式2:数据类型  数组名[];int  a[]:定义一个int类型的a数组变量。

推荐使用第一种格式,第一种格式的可读性更强。
注意:这两种定义做完了,数组中是没有元素值的。            如何对数组的元素进行初始化呢?

数组的初始化:

数组必须先初始化,然后才能使用。所谓初始化:就是为数组中数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化方式:

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。静态初始化:初始化时指定每个数据元素的初始值,由系统决定数组长度。(推荐使用)

这篇文章先介绍第一种格式的知识:

动态初始化格式:

数据类型[] 数组名=new 数据类型[数组长度];数组长度其实就是数组中元素的个数。
程序运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方法和内存管理方式。

那么主要使用的是栈内存和堆内存,栈内存存储局部变量,堆内存存储new出来的东西。
那么什么是局部变量呢?局部变量:在方法定义中或者方法声明上的变量都称为局部变量。
下面说一下这两种内存方式的特点:
【堆内存特点】:
A:每一个new出来的东西都有地址值;B:每个变量都有默认值            byte,short, int ,long    0
        float, double,  0.0
        char  ' \u0000'   ----空字符
        boolean       false
        引用类型  null
C:使用完毕后就变成了垃圾,但是并没有立即回收。会在垃圾回收器空闲时回收。
【栈内存特点】:
栈内存中数据用完就会释放掉。是脱离了变量的作用域后会释放掉。

那么下面举一个我写的小例子:
     【需求】:
     * 定义第一个数组,定义完毕后,给数组元素赋值,赋值完毕后,在输出数组名称和元素。
     * 定义第二个数组,定义完毕后,给数组元素赋值,赋值完毕后,在输出数组名称和元素。
     * 定义第三个数组,把第一个数组的地址赋值给它。(注意类型一致),通过第三个数组的名称去把元素重      复赋值。
     * 最后,再次输出第一个数组数组名称和元素。
public static void main(String[] args) {
//定义第一个数组
int[] arr=new int[3];
arr[0]=10;
arr[1]=20;
arr[2]=70;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("--------------");

//定义第二个数组
short[] arr2=new short[2];
arr2[0]=30;
arr2[1]=40;
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println("--------------");

//定义第三个数组
int[] arr3=arr;
arr3[0]=100;
arr3[1]=200;
arr3[2]=300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

}

运行结果:
数组内存分配之堆、栈

这里详细解释一下运行步骤:

数组一:

第一步:栈存储局部变量(在方法定义中或方法声明上的变量),所以int[] arr 存放在了栈中;第二步:new出的变量放在堆中,所以new int【3】在堆中。第三步:每一个new出来的东西都有地址值(系统随机分配),所以new int【3】的地址值为0x001;把0x001赋给arr,在栈中的数组通过地址值找到堆中相应的地址。用数组名和编号的配合就可以找 到数组中指定编号的元素,这种方法就叫做索引。
第四步:int类型的数据默认值为0第五步:给数组中的每个元素赋值,把原先的默认值干掉。第六步:逐个输出相应的值。

数组二和数组一相同。

数组三:

开辟一个内存空间 int[] arr3,把arr3的地址值0x001赋给该数组,所以数组3此时指向堆内存中的0x001对象。100赋值给编号为0的元素,200赋值给编号为1的元素。依次输出。

画一张图来更形象的表示:
数组内存分配之堆、栈