1 数组的概念
Java中数组是一种数组类型,也是一种引用类型,一个数组里只能存储一种数据类型的数据,数组的初始化一旦完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变。
2 数组的定义
定义数组的语法格式:
type[] ArrayName; 或 type ArrayName[];
通常建议使用 type[] ArrayName;方式定义数组。另外数组是一种引用类型的变量,使用它来定义一个变量的时候,这个变量还未指向任何有效的内存,因此定义数组的时候不能指定数组的长度,需要对数组进行初始化后才可以使用。
3 数组的初始化
数组的初始化有两种方式:静态初始化和动态初始化
3.1 静态初始化
语法格式:ArrayName = new type[] {num1 , num2 , num3 , ...} (type为数组元素的数据类型)
简化的语法格式: type[] ArrayName = {num1 , num2 , num3 , ...} (只有在定义数组的同时又执行数组初始化的时候才支持)
// 定义一个int数组类型的变量,变量名为intArr.
int[] intArray;
// 使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度。
intArray= new int[]{1, 2, 4 , 5};
// 定义一个Object数组类型的变量,变量名为objArr.
Object[] objArray1;
// 使用静态初始化,初始化数组时数组元素的类型是定义数组时所指定的数组元素类型的子类
objArray1 = new String[]{"左肩" , "千古"};
Object[] objArray2;
// 使用静态初始化
objArray2 = new Object[] {"左肩" , "千古"};
// 数组的定义和初始化同时完成,使用简化的静态初始化写法
int[] a = {1, 2 , 3, 4};
3.2动态初始化
动态初始化只指定数组的长度,由系统为每个数组元素指定初始值。语法格式:ArrayName = new type[length];
//数组的定义和初始化同时完成,使用动态初始化语法
int[] test = new int[5];
// 数组的定义和初始化同时完成,初始化数组时元素的类型是定义数组时元素类型的子类
Object[] books = new String[4];
系统按如下规则分配初始值
1)数组元素的类型是整型类型(byte、short、int、long),则数组元素的值为0;
2)数组元素的类型是浮点类型(float、double),则数组元素的值为0.0;
3)数组元素的类型是字符类型(char),则数组元素的值为'\u0000';
4)数组元素的类型是布尔类型(boolean),则数组元素的值为false;
5)数组元素的类型是引用类型(类、接口、数组),则数组元素的值为null;
3.3 数组的使用
Java语言的数组索引是从0开始的,最后一个数组元素的索引值是数组长度减1,如果访问数组元素时指定的索引值小于0或者大于等于数组的长度,编译程序不会出现任何错误,但运行的时候出现异常:java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常,N为程序试图访问的数组索引),遍历数组元素可以通过循环来实现遍历,例如使用foreach循环。
3.3.1 foreach循环
foreach循环语法格式:
for(type tmp : array | collection)
{
//tmp自动迭代访问每个元素
}
自从Java5之后,foreach循环被提供,使用foreach循环遍历数组和集合元素的特点:无须获得数组和集合的长度,无须根据索引来访问数组元素和集合元素,自动遍历数组和集合的每个元素。
public class ForEachErrorTest
{
public static void main(String[] args)
{
String[] books = {"左肩" , "千古", "认错"};
// 使用foreach循环来遍历数组元素,其中book将会自动迭代每个数组元素
for (String book : books)
{
book = "test";
System.out.println(book);
}
System.out.println(books[0]);
}
}
上面程序运行结果
test
test
test
左肩
从以上代码运行结果看出,使用foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值。