数组是最为常见的一种数据结构,是相同类型的、用一个标识符封装到一起的基本类型数据
序列或对象序列。可以用一个统一的数组名和下标来唯一确定数组中的元素。实质上,数组是一
个简单的线性序列,因此访问速度很快。
目录
4.1 数组的概述
数组是具有相同数据类型的一组数据的集合。
4.2 一维数组
一维数组实质上是一组相同类型数据的线性集合,例如学校中学生们排列的一字长队就是一个数组,每一位学生都是数组中的一个元素。
4.2.1 创建一维数组
数组元素类型决定了数组的数据类型。它可以是Java中任意的数据类型,包括基本数据类型和其他引用类型。数组名字为一个合法的标识符,符号"[]"指明该变量是一个数组类型变量。单个"[]表示要创建的数组是一个一维数组。
声明一维数组有两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
声明一维数组,语法如下:
int arr[]; //声明int型数组,数组中的每个元素都是int型数值
double[] dou; //声明double型数组,数组中的每个元素都是double型数值
代码中ar为数组名称,方括号“[]”中的值为数组的下标,也叫索引。数组通过下标来区分不同的元素,也就是说,数组中的元素都可以通过下标来访问。这就相当于刚才比喻的快捷酒店,我们想要找到某个房间里的人,只需要知道这个人所在房间号。这个房间号就相当于数组的下标。
数组的下标是从0开始的。
4.2.2 初始化一维数组
数组可以与基本数据类型一样进行初始化操作,也就是赋初值。数组的初始化可分别初始化数组中的每个元素。数组的初始化有以下3种方式:
int a[]={1,2,3}; //第一种方式
int b[]=new int[] {4,5,6}; //第二种方式
int c[]=new int[3]; //第三种方式
c[0]=7; //给第一个元素赋值
c[1]=8; //给第二个元素赋值
c[2]=9; //给第三个元素赋值
数组的初始化就是包括在大括号之内用逗号分开的表达式列表。用逗号“,”分隔数组中的各个元素,系统自动为数组分配一定的空间。第一种初始化方式,将创建3个元素的数组,依次为1、2、3;第二种初始化方式,创建3个元素的数组,依次为4、5、6;第三种初始化方式先给数组创建了内存空间,再给数组元素逐一赋值。
4.2.3 获取数组长度
初始化一维数组的时候都会在内存中分配内存空间,内存空间的大小决定了一维数组能够数组的 存储多少个元素,也就是数组长度。如果我们不知道数组是如何分配内存空间的,该如何获取数组长度呢?我们可以使用数组对象自带的length属性。语法如下:
arr.length
//arr:数组名
//length:数组长度属性,返回int值
例4.1 使用length属性获取数组长度。
代码如图所示:
运行结果如图所示:
4.2.4 使用一维数组
例4.2 在项目中创建类GetDay,在主方法中创建int型数组,并实现将各月的天数输出。
代码如图所示:
运行结果如图所示:
使用数组最常见的错误结束数组下标越界
4.3 二维数组
二维数组常用于表示表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
4.3.1 创建二维数组
二维数组可以看作是特殊的一维数组,二维数组有两种声明方式:
数组元素类型 数组名字[][];
数组元素类型[][] 数组名字;
声明二维数组。代码如下:
int tdarr1[][];
char[][] tdarr2;
同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用关键字new来分配内存,然后才可以访问每个元素。
为二维数组分配内存有两种方式:
int a[][];
a=new int[2][4]; //直接分配行列
int b[][];
b=new int[2][]; //先分配行,不分配列
b[0]=new int[2]; //给第一行分配列
b[1]=new int[2]; //给第二行分配列
4.3.2 初始化二维数组
二维数组的初始化方式与一维数组类似,也有3种方式。但不同的是,二维数组有两个索引(即下标),构成由行列组成的一个矩阵。
例4.3 分别用三种方法初始化二维数组。
代码如图所示:
4.3.3 使用二维数组
例4.4 创建一个二维数组,将古诗《春晓》的内容赋值于二维数组,然后分别用横板和竖版两种方式输出。
代码如图所示:
运行结果如图所示:
例4.5 创建一个不规则二维数组,输出数组每行的元素个数及各元素的值。
代码如图所示:
运行结果如图所示:
4.4 数组的基本操作
4.4.1 遍历数组
遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现的。遍历一维数组很简单,也很好理解,下面详细介绍遍历二维数组的方法。
遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。
例4.6 定义二维数组,实现将二维数组中的元素呈梯形输出。
代码如图所示:
运行结果如图所示:
4.4.2 填充和批量替换数组元素
数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行分配,可以起到填充和替换的效果。
1. fill(int[] a,int value)
该方法可将指定的int值分配给int型数组的每个元素。
语法如下:
Arrays.fill(int[] a,int value)
a:要进行元素分配的数组
value:要储存数组中所有元素的值
例4.7 通过fill()方法填充数组元素,最后将数组中的各个元素输出。
代码如图所示:
运行结果如图所示:
2. fill(int[] a,int fromlndex,int tolndex,int value)
该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引tolndex(不包括)。如果fromIndex==tolndex,则填充范围为空。
语法如下:
Arrays.fill(int[]a , int fromIndex, int toIndex, int value)
a:要进行分配的数组。
fromIndex:要使用指定值填充的第一个元素的索引(包括)。
toIndex:要使用指定值填充的最后一个元素的索引(不包括)。
value:要存储在数组所有元素中的值。
例4.8 通过fill()方法替换数组元素,最后将数组中的各个元素输出。
代码如图所示:
运行结果如图所示:
4.4.3 复制数组
Arrarys类的copyOf0方法与copyOfRange)方法可实现对数组的复制。copyOf)方法是复制数组至指定长度,copyOfRange)方法则将指定数组的指定长度复制到一个新数组中。
1. copyof()方法
该方法提供了多种使用方式,用于满足不同类型数组的复制。
语法如下:
Arrays. copyof(arr,int newlength)
arr:要进行复制的数组。
newlength:int型常量,指复制后的新数组的长度。如果新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char型数组则使用null来填充):如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。
例 4.9 创建一维数组,将此数组复制得到一个长度为5的新数组,并将新数组输出。
代码如图所示:
运行结果如图所示:
2. copyOfRange()方法
常用语法如下:
Arrays,copyofRange (arr,int formIndex,int toIndex)
arr:要进行复制的数组对象。
formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新数组包括索引是formlndex的元素。
toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素。
例4.10 创建一维数组,并将数组中索引位置是0-3之间的元素复制到新数组中,最后将新数组输出。
代码如图所示:
运行结果如图所示:
4.5 数组的排序
程序常用的排序方法有冒泡排序、选择排序等。
4.5.1 算法:冒泡排序
冒泡排序是最常用的数组排序算法之一,它以简洁的思想与实现方法备受青睐,是初学者最先接触的一个排序算法。使用冒泡排序时,排序数组元素的过程总是小数往前放,大数往后放,类似水中气泡往上升的动作,所以称作冒泡排序。
例4.11 在项目中创建BubbleSort类,这个类的代码将实现冒泡排序的一个演示,其中排序使用的是正排序。
代码如图所示:
运行结果如图所示:
4.5.1 算法:选择排序
直接选择排序方法属于选择排序的一种,它的排序速度要比冒泡排序要快一些,也是常用的排序算法。
4.12 在项目中创建SelectSort类,这个类的代码将作为选择排序的一个演示,其中排序使用的是正排序。
代码如图所示:
运行结果如图所示:
4.5.3 Arrays.Sort()方法
通过Amays类的静态sort)方法可实现对数组的排序。sort)方法提供了多种使用方式,可对任
意类型数组进行升序排序。
语法如下:
Arrays.Sort(object)
Object:被排序的数组。
例4.13 创建一维数组,并将数组排序后输出。
代码如图所示:
运行结果如图所示: