您的位置:首页 > 其它

数组内存分配之堆、栈

2017-01-14 20:03 106 查看

首先看一下数组:

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

数组的定义格式:

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


推荐使用第一种格式,第一种格式的可读性更强。

注意:这两种定义做完了,数组中是没有元素值的。
            如何对数组的元素进行初始化呢?

数组的初始化:

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

数组的初始化方式:

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


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

动态初始化格式:

数据类型[] 数组名=new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。

程序运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方法和内存管理方式。

那么主要使用的是栈内存和堆内存,栈内存存储局部变量,堆内存存储new出来的东西。

那么什么是局部变量呢?局部变量:在方法定义中或者方法声明上的变量都称为局部变量。

下面说一下这两种内存方式的特点:
【堆内存特点】:

A:每一个new出来的东西都有地址值;
B:每个变量都有默认值
            byte,short, int ,long    0

        float, double,  0.0

        char  ' \u0000'   ----空字符

        boolean       false

        引用类型  null

C:使用完毕后就变成了垃圾,但是并没有立即回收。会在垃圾回收器空闲时回收。
【栈内存特点】:
[b]栈内存中数据用完就会释放掉。是脱离了变量的作用域后会释放掉。

那么下面举一个我写的小例子:

     【需求】:

     * 定义第一个数组,定义完毕后,给数组元素赋值,赋值完毕后,在输出数组名称和元素。

     * 定义第二个数组,定义完毕后,给数组元素赋值,赋值完毕后,在输出数组名称和元素。

     * 定义第三个数组,把第一个数组的地址赋值给它。(注意类型一致),通过第三个数组的名称去把元素重      复赋值。

     * 最后,再次输出第一个数组数组名称和元素。
[/b]
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]);

}

[b][b][b][b]运行结果:[/b][/b][/b][/b]】



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

数组一:

第一步:栈存储局部变量(在方法定义中或方法声明上的变量),所以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的元素。
依次输出。


画一张图来更形象的表示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: