第3章 数 组 知识要点: 1.数组概述 2.一维数组 3.多维数组 4.不规则数组 学习目标: 通过本章的学习,要求读者掌握一维数组和多维数组的定义、初始化与使用,数组的内 存分配方式,不规则数组的使用。 3.1 数组概述 数组是一组具有相同类型或者类型兼容数据的集合,方便数据的管理和使用,是一种引 用数据类型。 Java语言中数组的使用非常灵活。按照所支持数据维度的不同,数组可以分为一维数 组和多维数组。按照每一维数据的个数是否相同,数组可以分为规则数组和非规则数组(锯 齿数组)。 在数组中有5个重要概念,分别是: (1)数组的名称(name),又称为数组名,代表一个数组。 (2)数组中的元素(element),数组中的每一个数据,数据在数组中有序排列。 (3)数组的类型(type),数组中每个数据的类型,通常是相同的类型。 (4)数组的索引(index),访问数组中元素的序号,序号的索引位置从0开始。 (5)数组的长度(length),数组中的元素个数,通过数组名.length获取。 例如,现实生活中,一个班级有几十位学生,班级就可以作为学生的数组,班级名作为数 组的名称,而每位学生作为数组中的一个元素,为了更好地管理学生,通常给每位学生分配 一个学号,作为数组的索引,通过学号可以快速地找到对应的学生,班级的总人数作为数组 的长度。 3.2 一维数组 3.2.1 一维数组的声明 类似于变量的声明,使用数组时,也要先声明数据类型和数组的名称。一维数组的声明 格式如下: 数据类型[] 数组名; ·73· 一维数组 或者 数据类型数组名[]; 例如:声明整型一维数组a如下: int[] a; 或者 int a[]; 注意:以上两种声明方式没有任何区别。一般推荐使用第一种方式声明数组。从声明 中可知数组的名称是a,数组中元素的类型是int。 数组中可以存放声明中的数据类型或者比声明数据类型小的类型,但是在使用数组中 的元素时,都以声明中的数据类型操作数据。例如,在本例中,int类型或者比int类型小的 数据类型数据(byte,short,char)可以放在该数组中,但是在使用时会自动转型成int类型 后使用。 数组的维度可以简单理解为有几对中括号,例如:一维数组在声明的时候有一对中括 号[],二维数组在声明的时候有两对中括号[][],以此类推。 声明数组时,不能指定数组的长度(即数组中元素的个数),下面的写法是错误的。 例如: int[3] a; 或者 int a[3]; 都是错误的 3.2.2 一维数组的创建 声明数组之后,数组中能存放多少个数据还不能确定,因为Java虚拟机(JVM)还没有 为存储数组中的元素分配内存空间,根据数组内存空间分配的不同方式,可以分为静态创建 方式和动态创建方式两种。 1.一维数组静态创建方式 数组名={元素1,元素2,…,元素n }; 也可以在声明数组的同时创建数组。如下所示: 数据类型[] 数组名={元素1,元素2,…,元素n }; 数据类型数组名[]={元素1,元素2,…,元素n }; 例如: int[] a; a=[10,20,30]; 或者 ·74· int[] a=[10,20,30]; 2.一维数组动态创建方式 数组名=new 数据类型[数组的长度]; 也可以在声明数组的同时创建数组。如下所示: 数据类型[] 数组名=new 数据类型[数组的长度]; 数据类型数组名[]=new 数据类型[数组的长度]; 例如: int[] a; a=new int[3]; 或者 int a=new int[3]; 注意:关键字new是内存分配符,可以动态地为数组开辟存储空间。 分配存储空间大小的公式是:存储数据的类型×数组的长度。例如,一个int类型数据 占4字节空间,则前面创建的数组a占用4×3=12字节的空间。 3.2.3 一维数组的使用 1.一维数组的使用 一维数组元素的访问格式如下: 数组名[索引] 注意:索引是非负的整型常数或表达式,数组的索引从0开始,到数组的长度减1结 束。如果索引小于0或者大于数组的长度减1时,则会出现运行时数组索引越界异常 ArrayIndexOutOfBoundsException。该索引也被称为元素在数组中的偏移位置。 【例3-1】 一维数组的创建和使用。 1 package javaoo; 2 public class Demo3_1 { 3 public static void main(String[] args) { 4 int[] a={10,20,30}; 5 System.out.println(a[1]);//20 6 int[] b=new int[3]; 7 b[0]=8; 8 System.out.println(b[0]);//8 9 System.out.println(b[1]);//0 10 System.out.println(b[5]);//ArrayIndexOutOfBoundsException 11 } 12 } 运行结果:见单行代码注释。 ·75· 代码解释: 第4行静态方式创建数组a,并存储3个int类型元素,分别是10,20,30。 第5行索引是1,表示要访问数组中的第2个元素,数组a中的第2个元素是20。 第6行动态方式创建数组时,系统会默认给数组的所有元素按照数据类型赋初值。本 例中数据类型是int类型,所以该数组中所有的元素初值默认为0。动态创建数组时元素的 默认初值见表3-1。 表3-1 动态创建数组时元素的默认初值 数据类型默 认 值备 注 byte 0 short 0 char \' u0000' int 0 long 0 实际为0L float 0.0 实际为0.0F double 0.0 实际为0.0D boolean false 引用类型null 第7行为数组b中的第1个元素重新赋值。 第10行无法访问到索引为5的元素,出现数组索引越界异常。 2.一维数组的遍历 一维数组的遍历,就是对一维数组中的所有元素按照相同的规律获取,常采用for循环 方式,其中用“数组名.length”表示一维数组的长度。 【例3-2】 一维数组的遍历。 1 package javaoo; 2 public class Demo3_2 { 3 public static void main(String[] args) { 4 int[] a={10,20,30}; 5 //普通for 循环语句的写法 6 for(int i=0;i