Java入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

4.2 一维数组

一维数组通常是指只有一个下标的数组元素组成的数组,它是Java语言程序设计中经常使用的一类数组。一维数组中的所有数组元素用一个相同的数组名来标识,用不同的下标来指示其在数组中的位置,系统默认下标从0开始。

4.2.1 创建一维数组

要使用Java中的数组,必须先声明数组,再为数组分配内存空间。数组元素的数据类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括基本数据类型和其他引用类型。数组名字为一个合法的标识符,符号“[]”指明该变量是一个数据类型变量。单个“[]”表示要创建的数组是一个一维数组。

声明一维数组有两种方式:

一维数组声明示例:

声明数组后,还不能访问它的任何元素,因为声明数组只是给了数组名字和数组的数据类型。要想真正使用数组,还需要为数组分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的语法格式如下:

     数组名= new 数据类型[数组元素个数];

主要参数介绍如下:

· 数组名:被连接到数组变量的名称。

· 数组元素个数:指定数组中变量的个数,即数组的长度。

例如,下面为数组分配内存空间,语法格式如下:

     myarr=new int[5]; //数组长度为5

这里表示要创建一个有5个元素的整型数组,并且将创建的数组对象赋给引用变量myarr,即变量myarr引用这个数组,如图4-2所示。

图4-2 一维数组的内存模式

这里的myarr是数组名,方括号“[ ]”中的值为数组的下标,也称为索引。数组通过下标来区分不同的元素,也就是说,数组中的元素都可以通过下标来访问。数组中的下标是从0开始,这里创建的数组myarr中有5个元素,因此数组中的元素下标为0~4。

【例4.1】创建一维数组,并输出该数组的默认值(源代码\ch04\4.1.txt)。

图4-3 声明数组应用示例

运行结果如图4-3所示。首先声明了一个int类型的变量arr,并将数组在内存中的地址赋值给它。arr[0]、arr[1]、arr[2]表示使用数组的索引来访问数组的元素,数组的索引从0开始,但没有赋值,所以显示的都是默认值0。

在声明数组的同时也可以为数组分配内存空间,这种创建数组的方法是将数组的声明和内存的分配合在一起执行。语法格式如下:

     数组元素类型 数组名= new数组元素类型[元素个数];

例如,这里创建数组myarr,并指定了数组长度的个数为5,这种创建数组的方法也是编写Java程序过程中的常用方法。

     int  myarr= new int[5];

4.2.2 一维数组的赋值

在Java中,数组可以和基本数据类型一样进行初始化操作,也就是赋值操作。数组的初始化操作有静态和动态两种。在定义数组时,指定数组的长度,由系统自动为元素赋初值的方式称为动态初始化。例如:

     int arr[] = new int[3];
     arr[0] = 5;
     arr[1] = 6;
     arr[2] = 9;

这种方式是先给数组创建了内存空间,然后再给数组元素逐一赋值。

☆大牛提醒☆

Java数组中的第一个元素,索引是以0开始的,如图4-4所示。

图4-4 数组中的元素与对应的索引

【例4.2】创建一维数组并动态初始化数组,然后计算出数组元素的总和(源代码\ch04\4.2.txt)。

图4-5 数组动态初始化

运行结果如图4-5所示。首先声明了一个数组变量myList,接着创建了一个包含5个int类型元素的数组,并且把它的引用赋值给myList变量,最后通过for循环语句计算出所有元素的和为72。

数组的初始化还有一种静态方式,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式,语法格式如下:

(1)数组元素类型[] 数组名={元素,元素,……};

(2)数组元素类型[] 数组名=new数组元素类型[]{元素,元素,……}。

例如,如下代码,就是利用静态方式初始化数组。

     //第一种
     int[] a1 = {2,5,8,9};
     int a2[] = {5,6,8,7};
     //第二种
     int[] b2 = new int[]{8,4,6,3,1};
     int b1[] = new int[]{4,5,8,2,1};

这两种方式都可以实现数组的静态初始化,但第二种更简便,不易出错,因此建议使用第二种方式。

【例4.3】创建一维数组并静态初始化数组,然后输出数组元素值(源代码\ch04\4.3.txt)。

运行结果如图4-6所示。这里使用两种静态初始化的方式为每个元素赋初值。int类型的数组没有采用new关键字,而是直接使用了{}来初始化元素的值,String[]类型的数组使用new String[]{}来初始化,这里要特别注意的是不能写成new String[3]{},这样编译器会报错。

图4-6 数组静态初始化

☆大牛提醒☆

当创建一个数组时,如果没有赋初值,那么Java会给数组元素赋予默认值0。例如下面一段代码:

运行之后输出10个0,这是数组变量的默认值。

【例4.4】创建一维数组,并给其中的数组元素赋值,然后输出该数组的全部元素值(源代码\ch04\4.4.txt)。

运行结果如图4-7所示。首先声明int类型的数组变量arr,长度为4。然后通过数组的索引进行赋值,但并没有对4个元素全部赋值,而是对arr[0]和arr[2]进行了赋值,从结果可以看出它们的值分别为1和3,而arr[1]和arr[3]没有赋值,因此显示的是默认值0。

图4-7 数组的默认值和赋值

4.2.3 遍历一维数组

遍历一维数组是通过索引实现的,也就是说直接通过有效索引号指定访问数组中的内容,例如如下代码:

【例4.5】创建一维数组,输出2000到2020年之间的闰年,这里已知2000年到2020年之间的闰年是2000、2004、2008、2012、2016、2020(源代码\ch04\4.5.txt)。

运行结果如图4-8所示。这里使用数组leapYear保存闰年年份,最后通过一层for循环将数组元素输出。

图4-8 闰年输出结果

☆大牛提醒☆

一定要记住数组索引号或者下标是从0开始的。不能访问索引号为大于或等于元素数量的内容,该内容不属于该数组的内存空间,系统会报错。上例4.5中,数组中有6个元素,那么这个数组就只有6个元素空间大小,数组是从0开始计数的,所以循环的变量i只能从0变化到5,共6个元素访问,如果访问到标号为6的内容,则会报错,终止程序,如图4-9所示。

图4-9 访问非法地址报错结果

在例4.5中,使用for循环语句遍历了数组的所有元素,这种写法读者一定要掌握。另外,Java JDK 1.5引进了一种新的循环类型,被称为foreach循环语句或者加强型循环语句,它能在不使用索引的情况下遍历数组。foreach循环语句的语法格式如下:

【例4.6】创建一维数组,使用foreach循环语句输出2000到2020年之间的闰年,这里已知2000年到2020年之间的闰年是2000、2004、2008、2012、2016、2020(源代码\ch04\4.6.txt)。

运行结果如图4-10所示。这里使用foreach循环语句对数组进行遍历。

图4-10 使用foreach循环语句遍历数组元素

☆大牛提醒☆

foreach循环语句相对于for循环语句要简洁,但也有缺点,就是丢掉了索引信息。因此,当访问数组时,如果需要访问数组的索引,最好使用for循环语句来实现循环或遍历,而不要使用foreach循环语句循环,因为它丢失了索引信息。

4.2.4 数组的length属性

当数组被分配内存时已经确定了元素的数量,元素数量表示数组的长度。数组自带一个length属性,表示该数组的长度,也就是可容纳的元素个数。语法格式如下:

     数组名.length

这就返回一个整型值。

【例4.7】创建一维数组,使用length属性输出数组的长度,这里已知数组中存有班里女生姓名,统计输出班级女生人数(源代码\ch04\4.7.txt)。

运行结果如图4-11所示。

图4-11 统计班级女生人数结果