深入理解数组

数组是一种引用类型数组,数组引用变量只是一个引用,数组元素和数组变量在内存中是分开存放的。

一、内存中的数组
数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。
与所有引用变量相同的是,引用变量时访问真实对象的根本方式。也就是说,如果希望在程序中访问数组对象本身,则只能通过这个数组的引用变量来访问它。
实际的数组对象被存储在堆(heap)内存中;如果引用该数组对象的数组引用变量时一个局部变量,那么它被存储在栈(stack)中。
如果需要访问堆内存中的数组元素,则程序中只能通过p[index]的形式实现。也就是说数组引用变量时访问堆内存中数组元素的根本方式。
为什么会有栈内存和堆内存?
因为一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也会销毁。所以,所有方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它

二、基本类型数组的初始化
对于基本类型数组而言,数组元素的值直接存储在对应数组元素中。因此,初始化数组时,先为该数组分配内存空间。然后将数组元素的值存入对应数组元素中。
例如:

public class ArrayTest
{
    public static void main(String[] args)
    {
        //定义一个int[]类型的数组变量
        int[] iArr;
        //动态初始化数组,长度为5
        iArr = new int[5];
        //采用循环方式为每个数组元素复制
        for(int i = 0;i < iArr.length;i++)
        {
            iArr[i] = i + 1;
        }
    }
}

三、引用类型数组的初始化
引用类型数组的数组元素是引用,因此情况变得更加复杂。每个数组元素里存储的还是引用,它指向另一块内存。
例如:

class Person
{
    public int age;//年龄
    public double height;//身高
    //定义了info方法
    public void info()
    {
        System.out.println("我的年龄是:" + age + ",我的身高是:" + height);
    }
}

public class ReferenceArrayTest
{
    public static void main(String[] args)
    {
        //定义一个students数组变量,其类型是Person[]
        Person[] students;
        //执行动态初始化
        students = new Person[2];
        //创建一个Person实例,并将这个Person实例给zhang变量
        Person zhang = new Person();
        //为zhang所引用的Person对象的age、height赋值
        zhang.age = 15;
        zhang.height = 165;
        //创建一个Person示例,并将这个Person实例给lee变量
        Person lee = new Person();
        lee.age = 16;
        lee.height = 167;
        //将zhang变量的值赋给第一个数组元素
        students[0] = zhang;
        students[1] = lee;
        //下面两行结果完全一样
        lee.info();
        students[1].info();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值