目录
1,数组概述
数组是具有相同数据类型的一组数据的集合,例如,球类的集合--足球、篮球、羽毛球等;器集合--电视机、洗衣机、电风扇等。在程序设计中,可以将这些集合称为数组。数组中的每个元素具有相同的数据类型。在 Java 中同样将数看作是一个对象,虽然基本数据类型不是对象由基本数据类型组成的数组则是对象。在程序设计中引入数组可以更有效地管理和处理数据。我们经常使用的数组包括一维数组和二维数组等。
2,一维数组
一维数组实质上是一组相同类型数据的线性集合,当在程序中需要处理一组数据, 或者传递一组数据时,就可以使用数组实现。
2.1创建一维数组
1,先声明,再用new关键字进行内存分配
声明一维数组有两种方式:
数组元素类型 数组名字[]; 数组元素类型[] 数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括基本数据类型和其他引用类型。数组名字为一个合法的标识符,符号“[ ]”指明该变量是一个数组类型变量。单“[ ]”表示要创建的数组是一个一维数组。
声明一维数组,语法如下:
int arr[]; //声明int型数组,数组中的每个元素都是int型数值
数组名字=new数组元素类型[数组元素的个数]; 数组名字:被连接到数组变量的名称。
arr=new int[5]; //数组长度为 5
2,声明的同时为数组分配内存
这种创建数组的方法是将数组的声明和内存的分配合在一起执行,语法如下:
数组元素类型数组名=new数组元素类型[数组元素的个数]; 声明并为数组分配内存,语法如下:
int month[] = new int[12];
上面的代码创建数组month,并指定了数组长度为12。这种创建数组的方法也是Java程序编写过程中普遍的做法。
2.2初始化一维数组
数组可以与基本数据类型一样进行初始化操作,也就是赋初值。数组的初始化可分别初始化组中的每个元素。数组的初始化有以下2种方式:
1、int arr[] = new int[]{1,2,3,5,25};
2、int arr2[]={34,23,12,6};
从中可以看出,数组的初始化就是包括在大括号之内用逗号分开的表达式列表。用逗号“”分隔数组中的各个元素,系统自动为数组分配一定的空间。第一种初始化方式,将创建5个元素的数组,依次为 1、2、3、5、25。第二种初始化方式,创建4个元素的数组,依次为34、23、12、6。
2.3使用一维数组
在Java中,一维数组是最常见的一种数据结构。下面的实例是使用一维数组将1~12月份各月份的天数输出。
代码
结果
3,二维数组
如果一维数组中的各个元素仍然是一个数组,那么它就是一个二维数组。二维数组常用于表示表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
3.1创建二维数组
二维数组可以看作是特殊的一维数组,因此二维数组有两种声明方式:
数组元素类型数组名字[][]; 数组元素类型[][]数组名字; 声明二维数组,代码如下:
int tdarrl[][]; char[][] tdarr2;
3.2初始化二维数组
二维数组的初始化方法和一维数组类似也有三种方式,但不同的是二维数组有两个索引。
type arrayname[][]={value1,value2,.....value};
type:数组数据类型。
arrayname:数组名称,一个合法的标识符。
value:二维数组中各元素,都代表一个一维数组。
int myarr[][] ={{12,0},{45,10};
3.3使用二维数组
二维数组在实际应用中非常广泛。
代码
结果
4,数组的基本操作
java.util包的Arrays类包含了用来操作数组(如排序和搜索)的各种方法.
4.1遍历数组
遍历数组就是获得数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组的基本操作,也很好理解,下面详细介绍遍历二维数组方法。
遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。
代码
结果
代码
结果
4.2填充替换数组元数
数组中的元素定义完成后,可通过 Arrays类的静态方法 fill0来对数组中的元素进行分配,可以起到填充和替换的效果。fill()方法有两种参数类型,下面以 int型数组为例介绍 fill()方法的使用。
1. fill(intl a , int value)
该方法可将指定的int值分配给int型数组的每个元素。语法如下:
Arrays.fill(int[] a, int value) a:要进行元素分配的数组。
value:要存储数组中所有元素的值
代码
结果
2. fill(int]a, int fromindex, int tolndex, int value)
该方法将指定的 int 值分配给int型数组指定范围中的每个元素。填充的范围从索引 fromIndex(包括)一直到索引toIndex(不包括)。如果fromIndex==toIndex,则填充范围为空。语法如下:
Arrays.fill(int!] a,int fromIndex, int toIndex, int value ya:要进行分配的数组。
yfromIndex:要使用指定值填充的第一个元素的索引(包括)。 toIndex:要使用指定值填充的最后一个元素的索引(不包括)。 value:要存储在数组所有元素中的值。 注意:如果指定的索引位置大于或等于要进行分配的数组的长度,则会报出 ArrayIndexOutOf-BoundsException(越界异常)异常
代码结果
4 .3对数组元数排序
通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序 语法如下:
Arrayss.sort(object)
其中,object是指进行排序的数组名称。
代码
结果
4.4复制数组
Arrarys 类的copyOf0方法与copyOfRange方法可实现对数组的复制。copyOf方法是复制数组
至指定长度,copyOfRangeO方法则将指定数组的指定长度复制到一个新数组中。
1. copyOf()方法
该方法提供了多种使用方式,用于满足不同类型数组的复制。语法如下: Arrays.copyof(arr,int newlength) y an:要进行复制的数组。
ynewlength:int型常量,指复制后的新数组的长度。如果新数组的长度大于数组ar的长度,
则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char 型数组则使用null);果数长小数组arr,会从arr第一个元素开始截取至满足新数组长度为止。
代码
结果
2、copyofRange()方法 该方法提供了多种使用方式,其常用语法如下:,
Arrays.copyofRange(arr,inf formIndexint toIndex
arr:要进行复制的数组对象。 formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新
数组包括索引是formIndex的元素。
toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素。
代码
结果
4.5查询数组
Arrays类的binarySearch()方法,可使用二分搜索法指定数组,以获得指定对象。该方法要搜索元素的索引值。
1.binarySeach(Obeject[]a,Obeject key)
a:要搜索的数组。
key:要搜索的值。
如果key包含在数组中,则返回搜索值的索引;否则返回-1或“-”(插入点)
代码
结果
2.binarySearch(Object[] a,int toIndex,Object key)
该方法在指定的范围检索某一元素。语法如下:
binarySearch(Object[]a,intfromIndex,int toIndex,Object key)
a:要进行检索的数组。
fromIndex:指定范围的开始处索引(包含)。
toIndex:指定范围的结束出索引 (不包括)。
key:要搜索的元素。
在使用该方法前,同样要对数组进行排序,这样才能获得准确的索引值。
代码
结果
5,数组排序算法
在程序设计中,经常需要将一组数据进行排序,这样更加方便统计与查询。程序常用的排序方法有冒泡排序、选择排序等。本节将对常用的数据排序方法进行详细讲解
5.1冒泡排序
冒泡排序是最常用的数组排序算法之一,它以简洁的思想与实现方法备受青睐,是初学者最先
接触的一个排序算法。使用冒泡排序时,排序数组元素的过程总是小数往前放,大数往后放,类似水中气泡往上升的动作,所以称作冒泡排序。
1.基本思想
冒泡排序的基本思想是对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
2.计算过程
冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般要排序数组长度减1次,为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。
代码
结果
5.2直接选择排序
直接选择排序方法属于选择排序的一种,它的排序速度要比冒泡排序快一些,也是常用的排序算法,是初学者应该掌握的。
1.基本思想
直接选择排序的基本思想是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。与冒泡排序相比,直接选择排序的交换次数要少很多,所以速度会快些。
2. 计算过程
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
代码
结果
5.3反转排序
顾名思义,反转排序就是以相反的顺序把原有的数组内容重新排序。