1、什么是数组
以酒店庄园为例,一个房间对应一个数据,一层楼对应一维数组,一栋楼对应二维数组,一个庄园对应三维数组,高维数组可以容纳若干低维数组,以此类推。
一个酒店可以开辟不同类型的房间,如单人间、双人间、情侣房、大床房等等,而数组不同,从创建之初,只能从一而终地容纳一种类型的数据。
或者可以将它理解为一个容器,鞋柜只能装鞋,冰箱只能放食物,不能将鞋放到冰箱里,也不能将食物放到鞋柜里。因此,若是 int[] 类的数组,就只能放整型数据,不能容纳其他数据类型,否则编译无法通过。
2、为什么要使用数组
当我们只需要创建一两个对象时,三两下就创建出来了,这并不费时间。但当我们需要创建100个对象,或者更多呢?是不是需要重复创建100次?而且每一个对象都需要一个变量名来特指,这会让编程过程变成一件非常痛苦的事情。而数组恰好完美的规避了这个问题,数组是一个变量,是存储相同数据类型的一组数据。
3、数组的基本要素
一个数组会包含四个要素:元素类型、标识符、数组元素和元素下标
以足球球队为例,首先我们需要知道这个足球球队代表哪一个国家,可以是中国的、可以是加拿大的,而球队所属国家要求队员们只能隶属于该国,不允许出现隶属于其他国家的成员;而一个国家也会有很多球队,此时我们需要给这个球队以区分与其他球队,即球队的名字;在球队中,人数是有限制的,或许是5人,或许是11人,超出这个上限将不会被纳入;在赛场上,很容易混淆球员,因此需要为每个球员进行编号,一个编号对应一个队员。
数组也是如此,元素类型即使索要存放数据类型,也就是球队所代表的国家;标识符也就是数组的名称,以区分其他不同的数组,也就是球队的名字;数组的元素有两个方面,一个是数组大小,也就是球队的人数限制,另一个是元素,也就是球员本身;数组下标则是足球球队里队员的编号,一个下标对应一个元素,在访问数组时,就是对元素下标的访问。
4、数组的使用
声明数组:数组中保存的类型(常采用第一种声明方法)
int[] scores;
String names[];
分配空间:数组的空间分配不同于基本数据类型,数组所分配的空间时若干个连续的地址,在栈空间中保存变量名,在堆空间中分配地址,这个部分我们在 浅谈java内存 这一章中有所谈及,这里不做赘述
赋值:也叫数组的初始化,可分为静态初始化和动态初始化
// 动态初始化:数组先声明,再分配空间,最后赋值
names = new String[]{"张三","李四","王麻子"};
scores = new int[4];
scores[0] = 0;
scores[1] = 1;
scores[2] = 2;
scores[3] = 3;
前面三个步骤也可以合并一起
// 静态初始化:数组声明的同时,进行初始化
double[] marks1 = {2.1,3.8,9.5};
double[] marks2 = new double[]{2.1,3.8,9.5};
5、二维数组的创建
以水果摊为例,直接上例子
// 二维数组示例,水果摊
// 第一维数组,记录水果摊里每个隔间保存的类别
String[][] fruitNames = new String[3][3];
// 第二维数组,记录水果摊每个隔间保存的内容
int[][] fruitNums = new int[3][3];
// 保存西瓜
fruitNames[2][2] = "西瓜";
fruitNums[0][0] = 3;
6、数组数据的处理
当我们要对数组的数据进行处理的时候,是根据下标进行的
细心的小伙伴在声明数组的时候已经发现了,数组声明分配空间时和数组访问下标最大值时,会有些出入:在声明时,我们输入的数值是数组的大小,而数组下标的起始值是从0开始,因此,在访问数组最后一个元素的时候,下标总会比大小小一,这点尤为注意,当下标超出指定范围时,会出现如下报错:ArrayIndexOutOfBoundsException(数组越界)
7、数组的遍历
如果需要对数组的每个元素进行操作,一个一个处理过于繁琐,因此需要与循环结构一起使用对数组进行遍历
常用的数组遍历方式有以下两种
// 普通循环
for (int i = 0; i < marks.length; i++) {
System.out.print(marks[i] + " ");
}
System.out.println();
// for each 循环
for (double i : marks) {
System.out.print(i + " ");
}
System.out.println();