程序员基础的16课 1 数组与内存控制

来源:互联网 发布:思科基于mac的acl 编辑:程序博客网 时间:2024/06/08 00:02

一 数组与内存控制

1.1 数组初始化有以下两种方式

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

Java数组是静态的,一旦初始化完成,数组元素的内存空间分配也完成,程序只能改变数组元素的值,不能改变数组的长度。需要指出的是Java数组变量是一种引用类型的变量,数组变量并不是数组本身,它指向堆内存中的数组对象。

当执行books=names语句,books数组变量变为指向names数组对象,原来的数组对象依然存在,长度是4,books和names将指向同一个数组对象,没有任何数组变量指向的数组对象,将会变成垃圾,等待垃圾回收器来回收。

1.2 始终记住一点,Java数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可以使用该数组对象。

 数组变量,类似于c中的指针,通常存放在栈内存中(也可以存放在堆内存中); 数组对象,是存放在堆内存中的一块连续的空间。该连续空间的长度,就是数组的长度。

1.3 基本类型数组的初始化

基本类型数组的初始化,数组元素的值,直接存放在对应的数组元素中,程序先为数组分配内存空间,再将数组元素的值,存放在对应内存里。
所有局部变量都存放在栈内存中,但引用类型变量所对应的对象,则总存在堆内存中。

1.4 引用类型数组的初始化

引用类型数组的数组元素依然是引用类型,因此数组元素中存储的还是引用,它指向另外一块内存,该内存中存储了该引用变量所引用的对象。

1.5 一个比较极端的情况,考虑内存的分配情况

    // 定义并初始化一个Object数组        Object[] objArr = new Object[3];        // 让objArr所引用的数组的第二个元素再指向一个长度为2的Object数组        objArr[1] = new Object[2];        // 将objArr[1]的值赋值给objArr2,即让objArr[1]和objArr2指向同一个数组对象        Object[] objArr2 = (Object[])objArr[1];        // 让objArr2所引用的数组的第二个元素再指向一个长度为3的Object数组        objArr2[1] = new Object[3];        // 将objArr2[1]的值赋值给objArr3,即让objArr2[1]和objArr3指向同一个数组对象        Object[] objArr3 = (Object[])objArr2[1];        // 让objArr3所引用的数组的第二个元素再指向一个长度为5的int数组        objArr3[1] = new int[5];        // 将objArr3[1]的值赋值给iArr,即让objArr3[1]和iArr指向同一个数组对象        int[] iArr = (int[])objArr3[1];        // 依次为iArr的每个元素赋值        for (int i = 0; i < iArr.length; i++) {            iArr[i] = i * 3 + 1;        }        // 直接通过objArr访问iArr数组的第三个元素        System.out.println(((int[])((Object[])((Object[])objArr[1])[1])[1])[2]); 

0 0
原创粉丝点击