您的位置:首页 > 编程语言 > Java开发

深入理解数组

2016-05-13 14:18 260 查看
数组是一种引用类型数组,数组引用变量只是一个引用,数组元素和数组变量在内存中是分开存放的。

一、内存中的数组

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

与所有引用变量相同的是,引用变量时访问真实对象的根本方式。也就是说,如果希望在程序中访问数组对象本身,则只能通过这个数组的引用变量来访问它。

实际的数组对象被存储在堆(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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java