一.一维数组
创建一维数组
数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式。
先声明,再用new关键字进行内存分配
声明一维数组有下列两种方式:
数组元素类型 数组名字[];
数组元素类型[]数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括简单类型和组合类型。数组名字为一个合法的标识符,符号“[]”指明该变量是一个数组类型变量。单个“[]”表示要创建的数组是一个一维数组。
声明一维数组,代码如下:
int arr[];
声明数组后,还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想真正使用数组,还要为它分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的语法格式如下:
数组名字 = new 数组元素的类型[数组元素的个数]
声明的同时为数组分配内存
这种创建数组的方法是将数组的声明和内存的分配合在一起执行。语法如下:
数组元素的类型 数组名=new数组元素的类型[数组元素的个数];
声明并为数组分配内存,代码如下:
int month[] = new int[12]
初始化一维数组
数组与基本数据类型一样可以进行初始化操作。数组的初始化可分别初始化数组中的每个元素。数组的初始化有以下两种方式:
1. int arr[] = new int[](1,2,3,5,25);
2. int arr2[]=(34,23,12,6);
使用一维数组
以下为使用一维数组输出1~12月每个月份的天数的示例:
二.二维数组
如果一维数组中的各个元素仍然是一个数组,那么它就是一个二维数组。二维数组常用于表示表,
表中的信息以行和列的形式组织,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
创建二维数组
二维数组可以看作是特殊的一维数组,因此二维数组的创建同样有两种方式。
先声明,再用new关键字进行内存分配
声明二维数组的语法如下:
数组元素的类型 数组名字[][];
数组元素的类型[][]数组名字;
声明二维数组,代码如下:
int a[][];
同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用new关键字来分配内存,然后才可以访问每个元素。对于高维数组,有两种为数组分配内存的方式。
第一种内存分配方式是直接为每一维分配内存空间,代码如下:
a = new int[2][4]
上述代码创建了二维数组a,二维数组a中包括两个长度为4的一维数组。
第二种内存分配方式是分别为每一维分配内存,代码如下:
a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];
声明的同时为数组分配内存
第二种创建方式与第一种实现的功能相同,只不过声明与赋值合并到同一行代码中。例如,创建一个2行4列的二维数组,代码如下:
int a = new int[2][4]
初始化二维数组
二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。语法如下:
type arrayname[]={value1,value2....valuen};
初始化二维数组,代码如下:
int myarr[][]={{12,0},{45,10}};
初始化二维数组后,要明确数组的下标都是从0开始。例如,上面的代码中myarr[1][1]的值为10。int 型二维数组是以int a[][]来定义的,所以可以直接给a[x][y]赋值。例如,给a[1]的第2个元素赋值的语句如下:
a[1][1] =20
使用二维数组
二维数组在实际应用中用得非常广泛。下面的实例就是使用二维数组输出一个3行4列且所有元素都是0的矩阵:
三.数据的基本操作
遍历数组
遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组很简
单,也很好理解,下面详细介绍遍历二维数组的方法。
遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。
在遍历数组时,使用foreach语句可能会更简单。下面的实例就是通过foreach 语句遍历二维数组。
填充替换数组元素
数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法
通过各种重载形式可完成对任意类型的数组元素的替换。fill()方法有两种参数类型,下面以int型数组
为例讲解fill()方法的使用方法。
fill(int[] a,int value)
该方法可将指定的int值分配给int型数组的每个元素。语法如下:
fill(int[] a, int value)
使用fill()方法填充数组元素:
fill(int[] a,int fromlndex,int tolndex,int value)
该方法将指定的int值分配给 int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引 toIndex(不包括)。如果fromIndex==tolndex,则填充范围为空。语法如下:
fill(int[] a, int fromlndex, int tolndex, int value)
使用fill()方法替换数组中的元素:
对数组进行排序
通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。语法如下:
Arrays sort(object)
使用sort()方法将数组排序后输出:
复制数组
Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。
copyOf()方法
该方法提供了多种重载形式,用于满足不同类型数组的复制。语法如下:
copyOf(arr, int newlength)
复制数组:
copyOfRange()方法
该方法同样提供了多种重载形式。语法如下:
copyOfRange(arr, int formlndex,int tolndex)
按照索引复制数组:
查询数组
Arrays类的 binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查找需要binarySearch()方法有两种参数类型。
binarySearch(Object[] a, Object key)
语法如下:
binarySearch(Object[] a, Object key)
查找元素在数组中的索引位置:
binarySearch(Object[] a, int fromlndex, int tolndex, Object key)
该方法在指定的范围内检索某一元素。语法如下:
binarySearch(Object[] a, int fromindex, int tolndex, Object key)
在指定范围内查找元素在数组中的索引位置:
四.数组排序算法
冒泡排序
在程序设计中,经常需要将一组数列进行排序,这样更加方便统计与查询。程序常用的排序方法有冒泡排序、选择排序和反转排序等。本节将讲解冒泡排序方法,它以简洁的思想与实现方法而备受开发人员青睐,是广大学习者最先接触的一种排序算法。
冒泡排序是最常用的数组排序算法之一,它排序数组元素的过程总是将较小的数往前放、较大的数往后放,类似水中气泡往上升的动作,所以称为冒泡排序。
基本思想
冒泡排序的基本思想是对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
算法示例
冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内层循环主要用于对比数组中每个邻近元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。例如,一个拥有6个元素的数组,在排序过程中每一次循环的排序过程和结果如下图所示。
算法实现
冒泡排序:
直接选择排序
基本思想
直接选择排序的基本思想是将指定排序位置元素与其他数组元素分别对比,如果满足条件就交换元素值,注意这里与冒泡排序的区别,不是交换相邻元素,而是把满足条件的元素与指定的排序位置元素交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,直至整个数组都变成已排序好的格式。
这就好比有一个小学生,从包含数字1~10的乱序的数字堆中分别选择合适的数字,组成一个1~10的排序,而这个学生首先从数字堆中选出1,放在第一位,然后选出2(注意这时数字堆中已经没有1了)放在第二位,以此类推,直到其找到数字9,放到8的后面,最后剩下10,就不用选择了,直接放到最后就可以。
与冒泡排序相比,直接选择排序的交换次数要少很多,所以速度会快些。
算法示例
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序地放在已排好序的数列的最后,直到全部待排序的数据元素排完。例如:
初始数组资源 【63 4 24 1 3 15】
第一趟排序后 【15 4 24 1 3 】 63
第二趟排序后 【15 4 3 1】 24 63
第三趟排序后 【1 4 3】 15 24 63
第四趟排序后 【1 3 】4 15 24 63
第五趟排序后 【1】 3 4 15 24 63
算法实现
反转排序
基本思想
反转排序的基本思想比较简单,也很好理解,其实现思路就是把数组最后一个元素与第一个元替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。
算法示例
反转排序是对数组两边的元素进行替换,所以只需要循环数组长度的半数次,如数组长度为7,那么for循环只需要循环3次。例如:
初始数组资源 【10 20 30 40 50 60】
第一趟排序后 60 【20 30 40 50】 10
第二趟排序后 60 50 【30 40】 20 10
第三趟排序后 60 50 40 30 20 10
算法实现