1. 定义
1. 同一个数组中只能存储一种数据类型的数据
2. 存储的数据类型可以是基本数据类型,也可以是引用数据类型
3. 数组也是一种类型,是一种引用数据类型.所以数组在定义的时候并未分配内存.
2. 初始化
1. 静态初始化
由程序员显示指定每个数组元素的初始值,由系统决定需要的数组长度
2. 动态初始化
由系统程序员指定数组长度,由系统按照数据类型指定数组元素初始值.
数组的初始化过程,就是为数组的数组元素分配内存空间的过程.静态初始化和动态初始化不能同时进行,
也就是不能即指定数组长度,又为数组元素指定初始值.
如果数组是引用类型的,每个数组元素中的数据就是引用数据类型,这时的引用数据类型是保存在堆内存中
的,而每个引用数据类型又指向另一块堆内存空间,存储有效的数据.
3. 内存中的数组
int[] arrayA = new int[3];
如上,arrayA只是一个引用变量,和创建类时一样,引用变量放在栈内存中.只有在new时,才会在堆内存中为对象分配内存空间.当将一个数组变量a,赋给数组变量b时,即将引用变量b也执行堆内存中a变量指向的对象实例,这样两个变量a和b都指向了同一个数组对象,而第二个数组则变成了垃圾,由系统垃圾回收机制在适当的时候回收这个对象所占用的内存.
代码清单: 数组的定义和初始化
public class ArrayTest {
public static void main(String[] args) {
int[] a = {1,2,3};//静态初始化
int[] b = new int[4];//动态初始化
System.out.println("数组a的长度:"+a.length);
for (int i=0;i<a.length;i++) {
System.out.println("a["+i+"]="+a[i]);
}
System.out.println("数组b的长度:"+b.length);
for (int i=0;i<b.length;i++) {
System.out.println("b["+i+"]="+b[i]);
}
b = a;
System.out.println("数组b的长度:"+b.length);
}
/*
result:
数组a的长度:3
a[0]=1
a[1]=2
a[2]=3
数组b的长度:4
b[0]=0
b[1]=0
b[2]=0
b[3]=0
数组b的长度:3
*/
}
4. 多维数组
java中的多维数组实质上还是一维数组.比如二维数组,数组元素也是引用,而数组元素中的引用指向一维
数组.
代码清单: 多维数组
import java.util.Arrays;
// Arrays类中包含常用的方法,包括复制数组,排序,查找,对比,填充等功能
public class ArrayTest2 {
public static void main(String[] args)
{
int[][] a = new int[3][2];//定义一个二维数组a
// 首先a是一个长度为3的一维数组
for (int i = 0; i < a.length ; i++ )
{
System.out.println(Arrays.toString(a[i]));//每个数组元素都是一个引用一维数组的引用变量
}
a[0][0] = 1;
a[0][1] = 2;
//在这个一维数组中的元素又是一个一维数组
System.out.println("二维数组的元素是一维数组:");
for (int j = 0; j < 2; j++) {
System.out.println("a[0][" + j + "]=" + a[0][j]);
}
System.out.println("重新赋值后的二维数组:");
for (int i = 0; i < a.length ; i++ )
{
System.out.println(Arrays.toString(a[i]));
}
// 二维数组的遍历
System.out.println("二维数组的遍历:");
for (int i=0;i<3;i++) {
for (int j=0;j<2;j++) {
System.out.println("a["+i+"]["+j+"]="+a[i][j]);
}
}
}
/*
[0, 0]
[0, 0]
[0, 0]
二维数组的元素是一维数组:
a[0][0]=1
a[0][1]=2
重新赋值后的二维数组:
[1, 2]
[0, 0]
[0, 0]
二维数组的遍历:
a[0][0]=1
a[0][1]=2
a[1][0]=0
a[1][1]=0
a[2][0]=0
a[2][1]=0
*/
}