一、数组类型
数组是一种最常见的数据结构,可用于存储多个数据,每个数组元素存储一个数据。通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和读取数组元素中的值。
Java中要求一个数组中所有的数组元素必须是同一种数据类型。因为Java是面向对象语言,类与类之间存在继承关系,因此容易造成Java数组的数组元素可以是多个类型的假象。比如苹果类和橘子类都可以继承水果类,因此在一个水果数组中,既可以有苹果对象,也可以有橘子对象(苹果、橘子都是特殊的水果)。但是这个数组类型仍然是唯一的,只能是水果。
二、定义数组
数组也是一种数据类型,比如int[]就是一种数据类型,与int类型、String类型类似,可以使用该类型定义变量,也可以用来进行类型转换。
Java定义数组有两种语法格式:type[] arrayName;
type arrayName[];
通常推荐使用第一种格式来定义数组,因为第一种不仅有更好的语义,而且具有更好的可读性。对于type[] arrayName;定义,很容易理解这是定义一个变量,变量名是arrayName,变量类型为type[]。前面已经提出type[]是一种新类型,与type类型完全不同(例如int[]类型是引用类型,而int类型是基本类型)。
数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了一个引用变量,这个引用变量还未指向任何有效内存,因此定义数组时不能指定该数组的长度。而且由于定义数组只定义了一个引用变量,没有指向任何有效内存空间,所以还没有内存空间来存储元素,因此这个数组也不能使用,只有对数组进行初始化之后才可以使用。
三、数组的初始化
Java中数组必须初始化才可以使用,所谓初始化,就是给数组元素分配内存空间,并为每个数组元素赋初值。
数组的初始化有一下两种方式。
- 静态初始化:初始化时由程序员指定数组元素的初值,由系统决定数组长度。
- 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初值。
静态初始化
语法格式如下:
arrayName = new type[]{element1,element2,...};
例如:
静态初始化还有如下简化的格式:
type[] arrayName = {element1, element2,...};
只有在定义数组的同时执行初始化才支持使用简化的静态初始化。
动态初始化
动态初始化只指定数组长度,由系统为每个数组元素指定初始值。语法格式如下:
arrayName = new type[length];
只需要指定一个int类型的length参数,这个参数指定了数组长度。与静态初始化类似的是,这里的type必须与定义该数组时使用的type类型相同,或者是定义数组时使用的type类型的子类。例如:Object[] books;
books = new String[5];
定义和初始化可以合为一步:Object[] books = new String[5];
动态初始化时,系统按如下规则为数组元素分配初始值:
- 数组元素的类型是基本类型中的整数类型(byte、short、int、long),则数组元素初值为0;
- 数组元素的类型是基本类型中的浮点类型(float、double),则数组元素初值为0.0;
- 数组元素的类型是基本类型中的字符类型(char),则数组元素初值为’\u0000’;
- 数组元素的类型是基本类型中的布尔类型(boolean),则数组元素初值为false;
- 数组元素的类型是引用类型(类、接口和数组),则数组元素初值为null。
四、遍历数组
int[] numbers = new int[10];
此时numbers数组变量指向一块内存区域,该内存区域存储了十个数组元素,每个数组元素均是整数类型,且由系统为数组元素分配初始值,初值均为0。
接下来遍历该数组并输出每个数组元素:
方法一:
for(int i=0; i<numbers.length; i++) {
System.out.println(numbers[i]);
}
方法二:
for(int number : numbers) {
System.out.println(number);
}
方法二为使用foreach循环遍历数组。Java 5之后,Java提供了一个更简单的循环:foreach循环,这种循环遍历数组和集合更加简洁。无需获得数组和集合的长度,无需根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素,直到该数组或集合的所有元素均被迭代一次后,自动跳出循环。foreach循环语法格式如下:
for(type variableName : array|collection) {
// variableName自动迭代访问每个元素...
}
其中,type是数组元素或集合元素的类型,variableName是一个形参名,作为循环变量,foreach循环将自动将数组元素、集合元素依次赋给该变量。
注意
使用foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值。