黑马程序员——JAVA基础---数组

时间:2022-03-24 12:36:35

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一 声明一维数组

假如现在需要统计公司员工的工资情况,要求计算平均工资、最高工资等,公司共有50名员工,根据以往学习的知识,设计这个程序需要声明50个变量,其实在现实编程中,不需要这么麻烦,只要使用数组就可以轻松解决这样的问题。
数组本质上是一组元素集合体,每一个元素都拥有一个索引值,只要指定索引值就可以取出对应的数据。

首先来看一下数组是如何声明的,一维数组是通过方括号[ ]来定义的,语法如下:
int[] array;
或者
int array[];
参数说明:
int:数组元素类型。
array:数组名称。
这两种形式的含义是一样的,后一种形式更符合原始编程习惯,但前一种方式较后者更为符合原理。在本书中笔者只使用第一种形式。
声明多种数据类型的数组。

boolean [] array;        //布尔型数组
float[] array; //浮点型数组
double[] array; //双精度型数组

二 创建一维数组

创建数组实质上就是在内存中为数组创建相应的存储空间,数组的创建需要使用花括号{}将一系列相同类型的数值放入存储空间内,当然,存储空间的分配由Java编译器负责,相当于使用new,例如:

语法:

int [] array={1,2,3,4,5,6};

参数说明:
array:数组名称。
为了访问数组的特定元素,应指定数组名及数组元素的位置序数(索引和下标)。一维数组的具体结构如图所示。
黑马程序员——JAVA基础---数组

 图7.1  一维数组内部结构
在图7.1中,c为数组名称,方括号中的值为序号,即数组下标。因此,数组中第一个值使用c[0]来表示,第二个值使用c[1],依次类推。

回到上文中提到的程序需求,若希望使用数组表示公司员工工资,可以使用c[0],c[1],c[2]…c[49]表示。

实现一维数组的打印。
1)创建Arrays类,在main()方法中输入以下程序:

int[] a1={1,2,3,4,5,6};                         //创建数组a1
int[] a2; //创建数组a2
a2=a1; //将a1赋予a2
for(int i=0;i<a1.length;i++){
a2[i]++;
System.out.println("a1["+i+"]="+a1[i]); //打印数组a1
System.out.println("a2["+i+"]="+a2[i]); //打印数组a2
}

代码说明如下:
可以看到代码中声明了一个没有数值的数组a2,这仅仅是实例化一个对象,即告知编译器要在存储器中分配存储空间,然后将数组a1赋值给数组a2,这个操作实质上在编译器内部是将a1的内存地址赋给数组a2。
打印数组内容时,笔者使用for循环语句,由于Java中的数组下标是从0开始的,所以for语句从0开始循环直至a1.length,length是Java 为数组提供的一个成员,它表示数组a1的长度,例如:
int ArrayLength=a1.length;
Java数组计数从0开始,最大数组下标为“length-1”,将a2[i]放入循环内,a2[i]即表示为数组a2中的每一个数值,所以a2[i]++可以表示将数组a2中每一个值都加1,最后在循环中分别打印数组a1和a2。

2)在Eclipse中编辑区域内,单击鼠标右键,选择“运行方式”→“Java应用程序”,运行上述代码,运行结果如图所示。
黑马程序员——JAVA基础---数组
图 Arrays.java运行结果
从运行结果中发现数组a1和a2的值相同,而在程序代码中,笔者只增加了数组a2的值,但数组a1的值也随之发生了变化,这正如步骤1所提到的那样,将数组a1的内存地址赋予了数组a2,数组a1和数组a2在内存中指向同一个地址,改变数组a2的值也就相当于改变了数组a1的值。

三 初始化一维数组

由于数组在Java中被看成一个对象,所以数组与基本数据类型相同,也可以进行初始化,在初始化的同时,可以规定数组的大小,也可以分别初始化数组中的每一个元素。

语法:

int[] array=new int[6];                     // 第1种初始化方式
int[] array=new int[]{1,2,3,4,5}; // 第2种初始化方式
int[] array={6,7,8,9}; // 第3种初始化方式

参数说明:
int:数组类型。
array:数组名称。
new:对象初始化语句。
初始化数组的方式有如语法中所示的3种,其中,第3种是C++数组的初始化方式。Java对这3种方式都支持,但笔者认为第1、2种方式更显自然。
使用第1种初始化方式,将会创建拥有6个元素的数组,但元素值并不确定,可以在程序中给数组赋值。使用第2种初始化方式,将会创建拥有5个元素的数组,并依次为数组的各个元素赋值为1、2、3、4、5。使用第3种方式,则会创建拥有4个元素的数组,并依次为数组各元素赋值为6、7、8、9。
注意:
即使使用new创建数组之后,它还只是一个引用,直到将值赋给引用,初始化过程才算结束。

初始化一维数组,实现数组的打印。

创建ArrayNew类,在main()方法中输入以下程序关键代码:


Random rand=new Random(); //实例化Random类对象
int[]a=new int[rand.nextInt(20)]; //随机产生0~20之间的数字作为int型数组的长度
double[]b=new double[rand.nextInt(20)]; //随机产生0~20之间的数字作为double型数组的长度
System.out.println("a "+a.length);
System.out.println("b "+b.length);
for(int i=0;i<a.length;i++){
a[i]=rand.nextInt(20); //将随机产生0~20之间的数字赋值给数组a
System.out.println("a["+i+"]="+a[i]); //打印数组a
}
for(int i=0;i<b.length;i++){
b[i]=rand.nextDouble(); //随机产生的double型数字赋值给数组b
System.out.println("b["+i+"]="+b[i]); //打印数组b
}


代码说明如下:
在上述代码中,使用了Random类,并且使用new实例化Random类的对象,读者可以查阅Java API,其中存在一个nextInt(int i)方法,此方法随机产生从0~i的整型值。
分别声明一个int型和一个double型的数组,随机产生0~20的整型值作为数组的长度,此时数组初始化完成,使用for循环语句为数组a和b赋值,赋予的值也是随机产生的,最后分别打印数组a与b。
运行结果如图所示。
黑马程序员——JAVA基础---数组

图 数组初始化结果

四 使用一维数组

在Java集合中,一维数组是最常见的一种数据结构,所以一维数组的应用范围非常广泛。
下面请读者看一个稍微复杂一些的例子,用来打印int型数组,double型数组操作步骤如下。
1)创建ArraySize类,在main()方法中输入以下程序关键代码:

Array[] ArrayB=new Array[5];    
int [] ArrayC=new int[5]; //创建int型数组
double[] ArrayD=new double[5]; //创建double型数组
for(int i=0;i<ArrayC.length;i++){
ArrayC[i]=i; //给数组ArrayC赋值
ArrayB[i]=new Array(ArrayC[i]); //给数组ArrayB赋值
}
for(int i=0;i<ArrayD.length;i++){
ArrayD[i]=Math.atan(i); //给数组ArrayD赋值
ArrayB[i]=new Array(ArrayD[i]); //给数组ArrayB赋值
}
for(int i=0,j=0;i<ArrayC.length;i++,j++){
ArrayB[i]=new Array(ArrayC[i],ArrayC[j]);
//给数组ArrayB赋值
2)在ArraySize.java文件中创建类Array:
public Array(int i){
System.out.println("int型数组"+i); //Array类构造函数
}
public Array(double i){ // Array类构造函数
System.out.println("double型数组"+i);
}
public Array(int i,int j){ //Array类构造函数
System.out.println("相乘数组"+i*j);
}

代码说明如下:
上述代码中包括两个类,当一个Java文件中包含两个或两个以上类时,文件以访问权限修饰符为public的类文件命名,由于类ArraySize访问权限修饰符为public,所以此文件名为ArraySize.java。
类a包括3个构造函数,根据参数的不同来区分引用哪个构造函数,这正是使用重载技术的思想,第一个构造函数的参数类型为int型,第二个构造函数的参数类型为double型,第三个构造函数的参数为两个int型的值,在此构造函数中取这两个参数的乘积。
初始化一个类型为类Array的数组ArrayB,同时分别初始化一个int型数组和一个double型数组,在for循环语句中为数组ArrayC赋值,然后将数组ArrayC中的值赋给数组ArrayB,由于数组ArrayB的类型为类Array,所以要使用new实例化类型为类Array的数组ArrayB,此时构造函数参数为数组ArrayC的值,这样使用到了类Array中的第一个构造函数。在第二个for循环中使用Math类的atan()方法返回变量i的tan值,返回值类型为double型,所以使用第二个构造函数实例化一个类型为类Array的数组ArrayB,并且打印。同理,在第三个for循环中,分别累加两个变量i与j,将两个int型变量赋给第三个构造函数,取这两个数的乘积并打印。

3)在Eclipse中编辑区域内,单击鼠标右键,选择“运行方式”→“Java应用程序”,运行上述代码,运行结果如图所示。
黑马程序员——JAVA基础---数组

图 一维数组的使用