一.数组概述
1. 什么是数组
数组是相同类型元素的集合。创建数组的时候,Java就会再内存中分配一段连续的空间来存放数组的内容。每一个数组内容都有自己的编号,这个编号从0开始的,也就是数组的下标从0开始。通过数组的下标来访问数组的内容。
2.一维数组的创建和初始化
创建一个数组:
T[] 数组名 = new T[N];T:数组中元素的类型。T[]:表示是数组类型,[]也可以放在数组名的后面。这里的[]不能有任何的数组N:创建数组要的长度。比如:
要对数组进行初始化,有两种方式。静态初始化:知道数组的内容,就可以静态初始化。
上面两种初始化的方式是没有区别的。如果不知道数组的内容,那么就可以使用动态初始化。
上面两种创建方式都可以分两步进行创建:
如果没有对数组进行初始化,数组中的元素有默认值。不同的数据类型有不同的默认值,如果是简单类型,大多是默认值为0。float是0.0f,double是0.0,char是/u0000,boolean是false;引用类型比如字符串类型则是null。
例题1.
运行结果
输出1~12月每个月的天数
首先创建一个类,然后主方法,创建并初始化一堆数组,利用循环将信息输出,输出每月的天数。
二、一维数组的使用
1、数组元素的访问
数组在内存中是一段连续的空间,下标是从0开始的。比如:
当然,我们可以对数组的内容进行修改。将上面的array[0]改为20:
在Java中,数组[]里面的大小支持常量,变量和表达式。
数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素。数组的下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
上面的结果报出了一个数组越界的异常。当下标是3的时候,说明越界了。这样的错误发生在main函数的第12行。通过这个,可以很快的找到问题的所在。
2、数组的遍历
在Java中,对数组的遍历有两种方式:第一种是for,第二种是增强for(foreach)。 由于Java是面向对象的语言,在Java中,一切都是对象,比如数组。数组这个对象有它的属性,比如数组的长度等,基于这一点,我们可以不用刻意知道数组的长度,使用.length来获取数组的长度。
三.二维数组
1.1.创建二维数组
二维数组可以看作是特殊的一维数组,因此二维数组的创建同样有两种方式。
1.2.先声明,再用new关键字进行内存分配
声明二维数组,语法如下:
数组元素的类型 数组名字[] [];
数组元素的类型[] [] 数组名字
声明二维数组,代码如下
int a[] []
同一维数组一样,二维数组在声明时有没有分配内存空间,同样要使用new关键字来分配内存然后才可以访问每个元素。对于高维数组,有两种为数组分配内存的方式。
a=new in[2][4]
2.声明的同时为数组分配内存
第二种创建方式与第一种实现的功能相同,只不过声明与赋值合并到同一行代码中,例如,创建一个2行4列的二维数组,代码如下:
int a=new int[2][4]
2.2初始化二维数组
二维数组的初始化与一维数组初始化类型,同样可以使用大括号完成。语法如下:
type arrayname[][]={value1,value2,.....value};
type:数组数据类型。
arrayname:数组名称,一个合法的标识符。
value:二维数组中各元素,都代表一个一维数组。
int myarr[][] ={{12,0},{45,10};
初始化二维数组后,要明确数组的都是下标都是从0开始。例如,上面的代码中myarr[][]的值为10.int型二维数组是以int a[][]来定义,所以可以直接给a[x][y]赋值。
例题2.输出一个3行4列所有元素都为0的矩阵
运行结果
二维数组在实际应用中得到非常广泛,创建一个类,主方法中编写实现输出一个3行4列所有元素,循环遍历数组中的每个元素,将数组中的元素输出,最后输出空格。
3.1数组的基本操作
3.1.1遍历数组
遍历数组就是获得数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组的基本操作,也很好理解,下面详细介绍遍历二维数组方法。
遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。
例题3.呈梯形二维数组
代码如下
运行结果如下:
定义二维数组,循环遍历二维数组中的每个元素,将数组中的元素输出,在遍历数组时,使用foreach语句可能会更简单。
例题4.使用foreach语句遍历二维数组,使用foreach语句遍历二维数组,实例代码如下:
运行结果如下:
3.3.2填充替换数组元素
数组中的定义完成,通过Array类的静态方法fill()对数中的元素进行替换通过各种重载形式可完成对任意型的数组元素的替换。
1.fill(int)[]a,int value)
该方法可将指定的int值分配给int型数组的每个元素。
a:要进行元素替换的数组。
value:要储存数组中的所有元素的值。
例题5.使用fill方法填充数组元素代码如下:
运行结果如下:
创建 导入java.util.Arrays类,主方法,创建iint型数组使用同一个值对数组进行填充,将数组中的元素一次输出。
2.fill(int[] a,int formlndex,int tolndex,int value)
该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直索引toIndex(不包括).如果fromIndex==toIndex,则填充范围为空。语法如下:
fill(int) a,int fromIndex,int toIndexx,intvalue)
a:要进行填充的数组。
fromIndex:要使用指定值填充的第一个元素的索引(包括)。
toIndex:要使用指定值填充的最后一个元素的索引(不包括)。
value:要分配给数组指定范围中的每个元素的值。
误区:如果指定的索引位置大于或者等于要进行填充的数组的长度,则会报出ArrayIndexOutOf-BoundsExcption(数组越界异常)。
例题6使用fill()方法替换数组元素代码如下:
运行结果如下:
3.3对数组进行排序
通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序 语法如下:
Arrayss.sort(object)
其中,object是指进行排序的数组名称。
例题7.使用sort()方法将数组排序后输出代码如下:
运行结果如下:
在主方法中创建一维数组,将数组排序后输出,上述实例是对整型数组进行排序,java中的String类型数组的排序算法是根据字典编排顺序的,因此数字排在字母前面,大写字母排在小写字母前面。
4.复制数组
Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制至指定的长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。
1.copyOf方法
arr:要进行复制的数组。
newlength:int型常量,指复制后的长度。如果新数组的长度大于arr的长度,则用0来填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char型数组则使用null来填充)。
例题8.复制数组代码如下:
运行结果如下:
在项目中创建的类,主方法中创建一维数组,实现此数组复制得到一个长度为5的新数组输出结果为23,42,12,0.
2.copyOfRange方法
该方法同样提供了多种重载形式。语法如下:
copyOfRange(arr,int fromIndex,int toIdex)
arr:要进行复制的数组对象。
fromIndex:指定开始复制数组的索引位置,fromIndex必须在0至整个数组的长度之间。新数组包括fromIndex的元素。
toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素。
例题9按照索引复制数组
代码如下:
运行结果如下:
5.查询数组
Arrays类的binarySearch()方法,可使用二分搜索法指定数组,以获得指定对象。该方法要搜索元素的索引值。
1.binarySeach(Obeject[]a,Obeject key)
a:要搜索的数组。
key:要搜索的值。
如果key包含在数组中,则返回搜索值的索引;否则返回-1或“-”(插入点).
例题10.查找元素在数组中的索引位置
代码如下:
运行结果如下:
返回值“1”是对数组ia进行排序后元素4的索引位置。
2.binarySearch(Object[] a,int toIndex,Object key)
该方法在指定的范围检索某一元素。语法如下:
binarySearch(Object[]a,intfromIndex,int toIndex,Object key)
a:要进行检索的数组。
fromIndex:指定范围的开始处索引(包含)。
toIndex:指定范围的结束出索引 (不包括)。
key:要搜索的元素。
在使用该方法前,同样要对数组进行排序,这样才能获得准确的索引值。
例题11.在指定范围查找元素在数组中的索引位置
代码如下:
运行结果如下:
导入java.until.Array类,定义String型数组str将数组进行排序在指定范围内搜索元素“cd"的索引位置将索引输出。
5.5数组排序算法
5.5.1冒泡排序
冒泡排序是最常用的数组排序算法之一,它排序数组元素的过程总是将较小的数往前放,较大的数往后放,类似水中的气泡上升的动作,所以叫做冒泡。
1.基本思想
冒泡排序的基本思想是相对的元素值,如果满足条件就交换元素值,把较小的元素移动数组前面,把较大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部往上升顶部。
2.算法运算
冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般要排序数组长度减1次,为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。
3.算法实现
例题12冒泡排序代码如下:
运行结果如下:
从实例运行结果看出,数组中的已经按从小到大的顺序排好了。冒泡排序的主要思想是:把相邻两个元素进行比较,满足以下条件进行交换(如判断大小或者日期前后等),每次将最大(最小)的元素排在最后,下一次循环是对数组中的其他元素进行类似操作)。
5.5.2直接选择排序
直接选择排序思想就是指定排序位置与其他元素分别对比,如果满足条件就交换素值。
5.5.3反转排序
顾名思义,反转排序就是以相反的顺序把原有的数组内容重新排序。
例题13反转排序
代码如下:
运行结果如下:
vvvvvvvv