数组与内存控制

来源:互联网 发布:java自增id生成策略 编辑:程序博客网 时间:2024/06/07 22:12

一、数组初始化

1.数组初始化方式有两种:

静态初始化:初始化时显示的指定每个元素的初始值。比如:int [] a=new int[]{1,2,3}或者int[] a={1,2,3}

动态初始化:初始化时只指定数组长度,由系统分配初始值。比如:int[] a=new int[3]

2.需要注意的问题

(1)Java数组是静态的,即数组被初始化以后,数组的长度是不能改变的。

(2)Java的数组变量时一种引用类型的变量,即数组变量不是数组本身,它只是指向堆内存中的数组对象。

3.数组的内存分配机制

(一)基本类型数组的初始化

基本类型数组,数组元素的数值直接存在对应的数组元素中,因此基本类型数组的初始化是程序先为数组分配内存空间,再将数组元素的值存入相应的内存中。

(1)int[] a:仅定义一个数组变量,它是一个引用类型变量,此时并没有初始化,即没有指向有效的内存,此时内存中的存储如下:


(2)int[] a=new int[3]:动态初始化了数组,长度为3,此时数组的长度不再改变,只有数组元素的值可以改变,此时内存中的存储如下:


(3)a[0]=1:另数组a的第一个元素为1,则内存中的存储如下:


(4)int[] b=a:让b数组指向a所引用的数组,这也说明一个问题,即我们常说的java数组之前必须初始化,这初始化指的是数组对象初始化,这数组对象是存放在堆内存中的连续内存空间里面的;而a和b只是数组变量即两个引用变量,通常存放在栈内存空间中,对于数组变量来说是不需要初始化的,只要让数组变量指向一个有效的数组对象即可。因此此时的内存空间分配如下:


(5)int[] c={1,2,3,4};b=c:初始化一个数组c,并且另数组b指向数组c所引用的数组对象,此时内存分配如下:


(二)引用类型数组的初始化

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

比如我们先定义了一个person类,里面包括两个变量int age和double height。

(1)person[] students=new person[2]:初始化了一个students数组变量,students数组的两个数组元素都是引用,此时这两个引用并没有指向有效的内存空间,因此都为空。内存分配空间如下:


(2)person a==new person();a.age=2;a.height=3.4;students[0]=a:新定义一个引用变量a,并且另students[0]指向a,内存空间分配如下:


(三)所有的局部变量都是放在栈内存里保存的,不管是基本类型还是引用类型,都是存在各自的栈区中,但是引用类型锁引用的对象都是在堆内存中。堆内存中的对象通常不允许直接访问,只能通过引用变量。引用变量本身是一个指针,只要程序通过引用变量来访问属性或者通过引用变量来调用方法,该引用变量就会由它所引用的对象代替。

NullPointerException(空指针异常)当通过引用对象来访问对象或者调用非静态方法时,若该引用变量没有指向有效的对象,则会报这个异常。

二、数组的使用

1.数组元素就是变量

2.没有多维数组,N维数组就是数组元素是N-1维的数组的数组。初始化多维数组时可以先初始化最左面的维数,此时该数组的每个元素都相当于一个数组引用变量,这写数组还需要进一步的初始化。

比如:int[][] a=new int[4][];a[0]=new int[2]。此时数组a的长度是4,数组的length指的是系统为该数组分配的连续内存空间的长度。

原创粉丝点击