“你会使用Java?”
“是的”
“那你能不能叙述一下,在Java中,声明一个数组的过程中,是如何分配内存的”
“。。。”
“那Java数组的初始化有哪几种方式呢?”
“。。。”
“好吧,那你说说基本类型数组与引用类型数组在初始化时内存分配机制的差别吧”
“。。。”
“下一个。。。”
数组初始化
1、Java数组是静态的
Java数组初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值,数组必须经过初始化后才能使用。而静态,就是说,一旦Java数组被初始化,数组的长度就不可改变。
数组初始化有两种方式:
1)、静态初始化:初始化时程序员显示指定每个元素的初始值,由系统决定数组长度
2)、动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值
以下分别是两种初始化方法的实现:
int[] nums={1,2,3,4};//(1)
int[] numss=new int[3];//(2)
上面声明的数组在内存中的示意图如下:
需要注意,Java数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。因此,可以改变一个数组变量所引用的数组。假设在将nums指向numss,即:nums=numss
则内存将会改变
这会给我们造成数组长度可变的假象。要注意,数组对象本身的长度并没有发生改变,变的是nums数组变量,原来的numss数组长度依然是4,但不再有任何引用变量引用该数组,因此它将变成垃圾,等待垃圾回收机制回收。
2、数组一定要初始化吗
不一定。可以将一个已经初始化的数组赋给一个未初始化的数组。
我们刚刚才说使用Java数组之前必须初始化,怎么突然又说不用了呢?这不是出尔反尔吗?其实不然。大部分时候,我们都把数组变量和数组对象搞混了,数组变量(类似C中指针)只是一个引用变量,通常存放于栈内存中(也可放于堆内存中);而数组对象是保存在堆内存中的连续内存空间。对数组执行初始化实际是对数组对象执行初始化。对于数组变量来说,并不需要初始化,只要让数组变量指向一个有效的数组对象即可!
对于Java程序中所有的引用变量,都不需要经过所谓的初始化操作,需要进行初始化的都是该引用所引用的对象。
3、基本类型数组的初始化
int[] n={1,2,3,4};
内存如下:
注意:所有的局部变量都是放在栈内存中保存的,不管是基本类型变量还是引用类型变量,都是存储在各自的方法栈中;但引用类型所引用的对象(包括数组,普通Java对象)则总是存储在堆内存中。堆内存中的对象通常不允许直接访问,只能通过引用类型变量
public class PrimitiveArrayTest
{
public static void main(String[] args)
{
int[] iArr=null;
//只要不访问iArr的属性和方法,程序完全可以使用该数组变量,因为实质上只是在访问栈内存
System.out.println(iArr);
//动态初始化数组,数组长度为5
iArr=new int[5];
//只要iArr指向了有效的数组对象之后就可以访问其属性了
System.out.println(iArr.length);
4、引用类型数组初始化
public class Person
{
public int age;
public int weight;
public void info()
{
System.out.println("我的年龄:"+age+"体重"+weight);
}
}
public class ReferenceArrayTest
{
public static void main(String[] args)
{
Person[] students;
students=new Person[2];
Person zhang=new Person();
zhang.age=20;
zhang.weight=120;
Person wang=new Person();
wang.age=30;
wang.weight=150;
students[0]=zhang;
students[1]=wang;
zhang.info();
students[0].info();
//两行输出完全一样
内存如下图
使用数组
由于使用数组的部分在Java根基中有比较详细的介绍,这里就不再啰嗦了,有需要的可以去我的分类中的Java根基中查看。