数组是一种很常用的引用数据类型,用来存放一系列同类型的数据。访问时只需要变换一个整型下标就可以访问到数组中的每一个元素。元素是数组中内容的别称,数组中每一项称为一个元素。

1.声明

数组的声明需要指出数组中元素的类型和数组变量名,并且有两种方式声明:(1).数据类型[] 数组变量名 (2).数据类型 数组变量名[]。

int[] array; 
int array[];

这两种声明都可以声明一个名为array的int类型数组,但大多数人习惯第一种写法,因为这样数组变量名会独立出来,一目了然。

2.初始化

在上一步声明之后,array还没有称为一个真正的数组,它现在还没有自己的内存空间,只有一个名字。所以,声明后紧接着还要对数组进行初始化。初始化需要用new关键字来开辟一段内存,创建数组。格式为 类型[] 数组变量名 = new 类型 [数组大小];。

int[] array = new int[10];

这样,array数组现在就可以容纳十个int类型的数据了。在刚初始化完成后,所有的元素都是默认值,整型默认是0,浮点型默认是0.0,布尔型默认是false,字符串类型为null。

我们也可以在初始化的同时为数组元素赋值。格式为 类型[] 数组变量名 = new 类型[] {值1,值2,……};。注意这里的[]中不写数组大小。而且,用这种方式初始化时,可以将 new 和 类型 省略。即类型[] 数组变量名 = {值1,值2,……};。

int[] array_1 = new int[]{10, 20, 30};
int[] array_2 = {10, 20, 30};          //array_1与array_2中元素是一样的

一旦创建好数组后,就不能改变其大小。而且任何对其规定范围外的访问都会引发异常。若需要在运行过程中需要变化数组大小,可以尝试ArrayList动态数组。

3.访问

对数组的访问可以使用一个整型下标来完成。格式为 数组名[下标]。如:

int[] array = {2,4,6,8};
System.out.println(array[0]); //输出2
System.out.println(array[1]); //输出4

每一个数组的下标都是从0开始的,也就是当我们创建了一个长度为n的数组,那该数组的下标界限就是0 ~ n-1。

而数组因其特有的性质,我们可以更加方便地使用循环结构对其访问。

int[] a = new int[10];
for(int i = 0; i < 10; i++)
{
    a[i] = i + 1;
}
//该for循环结束后数组a内容为{1,2,3,4,5,6,7,8,9,10}

for(int i : a)
    System.out.println(i);
//该增强for循环从a[0]开始依次输出a中每一个元素。

注:这里增强for只能用于输出不能输入。

4.数组变量与实例的关系

考虑以下情况:

int[] a = new int[] {1,2,3};
int[] b = new int[] {1,2,3};
int[] c = a;

这里的数组b和c中元素相同吗?修改数组a中元素后b和c还相同吗?

首先用for循环遍历输出a,b,c。得到的结果是这样:

a:1 2 3 
b:1 2 3 
c:1 2 3

显然a,b,c中元素相同。此时在数组abc的声明代码后再加一行代码 a[0] = 4; ,将a中元素修改,此时a数组中元素显然为{4,2,3}。再输出三个数组中元素,结果为:

a:4 2 3 
b:1 2 3 
c:4 2 3

此时a与c均发生了变化,都变成了{4,2,3}。这是为什么呢?

事实上这是数组拷贝,当一个数组变量赋值为另一个数组变量时,这两个变量就会指向同一个数组实体。

用一个同学举的例子来说,就像是a与c合租了。a与c虽然不是同一个人,但他们指向同一个房子。若a,b,c都要回家使用冰箱,则a与c使用的是同一个冰箱,而b则独自占用一个冰箱。当a把冰箱里的牛奶拿出来换成了酸奶(a[0] = 4),则c使用的冰箱里的牛奶也会变成酸奶(c[0] = 4),而b则不受影响。

多个数组变量效果也一样,若这样写:c = a; b = a; 则a,b,c三个变量就指向同一个数组实体,abc三人就住在同一个房子里,这下b的牛奶也没有了。

5.二维与多维数组

既然数组元素可以为任何类型,那我们就可以将一个一维数组作为数组的类型,这样就产生了二维数组。二维数组有两个下标,通过这两个下标可以访问每个元素。就像一个平面直角坐标系,通过x,y轴坐标就可以定位不同的点。

二维数组的声明:类型[][]  数组变量名。同样,声明后需要初始化。而与一维不同的是,用具体值来初始化时需要两层大括号才能完成。

int[][] array_2d1 = new int[2][3];
int[][] array_2d2 = new int[][] {{1,2,3},{4,5,6}};
int[][] array_2d3 = {{1,2,3},{4,5,6}};

以上三种声明方式均可。

二维数组访问时可以采用双层循环嵌套来访问每一个元素。

for(int i = 0; i < 2; i++) //该循环可以依次输出array_2d3的每个元素
{
    for(int j = 0; j < 3; j++)
    {
        System.out.println(array_2d3[i][j]);
    }
}

三维及以上的数组与二维类似,此处不再赘述。