05数组.docx
《05数组.docx》由会员分享,可在线阅读,更多相关《05数组.docx(21页珍藏版)》请在冰豆网上搜索。
![05数组.docx](https://file1.bdocx.com/fileroot1/2022-12/7/b7b90ac6-713e-44ff-9394-6f71ed505654/b7b90ac6-713e-44ff-9394-6f71ed5056541.gif)
05数组
1.纲要
a)数组概要
b)一维数组的声明和使用
c)二维数据的声明和使用
d)数组的排序
e)数组的查找
f)Arrays工具类
2.内容
2.1、数组概要
数组是一种引用数据类型,在内存中存储示意图如下:
1.数组是一组数据的集合
2.数组作为一种引用类型
3.数组元素的类型可以是基本类型,也可以是引用类型,但同一个数组只能是同一种类型
4.数组作为对象,数组中的元素作为对象的属性,除此之外数组还包括一个成员属性length,length表示数组的长度
5.数组的长度在数组对象创建后就确定了,就无法再修改了
6.数组元素是有下标的,下标从0开始,也就是第一个元素的下标为0,依次类推最后一个元素的下标为n-1,我们可以通过数组的下标来访问数组的元素
2.2、一维数组的声明和使用
2.2.1、数组的声明
一维数组的声明格式有以下两种:
1.数组元素的类型[]变量名称
2.数组元素的类型变量名称[]
数组元素的类型,可以是java中的任意类型,变量名称可以是任意合法的标识符,上面两种格式较常用的是第一种,例如:
int[]a;
Student[]stu
在一行中也可以声明多个数组,例如:
int[]a,b,c
2.2.2、数组的创建
数组有两种创建方式
●第一种,使用new操作符来创建数组,格式为:
new数组元素的数据类型[数组元素的个数]
1.基本类型的数组
publicclassArrayTest01{
publicstaticvoidmain(String[]args){
//声明int类型的数组,长度为5
//数组中的元素必须为int类型
int[]data=newint[5];
//对数组中的元素进行赋值,如果不赋值默认为该类型的默认值,以上数组默认为0
//如何赋值?
变量名[下标],下标从0开始
data[0]=1;
data[1]=2;
data[2]=3;
data[3]=4;
data[4]=5;
//输出数组中的元素,变量名[下标]
System.out.println(data[0]);
System.out.println(data[1]);
System.out.println(data[2]);
System.out.println(data[3]);
System.out.println(data[4]);
System.out.println("-----------------------");
//采用length属性可以取得数组的长度
for(inti=0;iSystem.out.println(data[i]);
}
//输出指定的数组元素
System.out.println("data[3]="+data[3]);
//会抛出ArrayIndexOutOfBoundsException异常
//数组下标越界
System.out.println("data[10]="+data[10]);
//不能成功赋值,数组中的类型必须是一种类型
//data[0]="iiii";
}
}
内存结构
int[]data=newint[5];
data[0]=1;
data[1]=2;
data[2]=3;
data[3]=4;
data[4]=5;
必须清楚数组为引用类型,它在堆中分配
2.引用类型的数组
【示例代码】
publicclassArrayTest02{
publicstaticvoidmain(String[]args){
//声明引用类型的数组
Student[]student=newStudent[2];
//出现空指针
//因为引用类型的数组,它采用null作为默认的初始化值
student[0].id=1001;
student[0].name="张三";
student[1].id=1002;
student[1].name="李四";
}
}
classStudent{
intid;
Stringname;
}
修正空指针
publicclassArrayTest03{
publicstaticvoidmain(String[]args){
//声明引用类型的数组
Student[]student=newStudent[2];
//初始数组元素为Student对象
/*
student[0]=newStudent();
student[0].id=1001;
student[0].name="张三";
student[1]=newStudent();
student[1].id=1002;
student[1].name="李四";
*/
//可以采用如下方式赋值
Studentzhangsan=newStudent();
zhangsan.id=1001;
zhangsan.name="张三";
student[0]=zhangsan;
Studentlisi=newStudent();
lisi.id=1002;
lisi.name="李四";
student[1]=lisi;
for(inti=0;iSystem.out.println("id="+student[i].id+",name="+student[i].name);
}
}
}
classStudent{
intid;
Stringname;
}
Student[]student=newStudent[2];
Studentzhangsan=newStudent();
zhangsan.id=1001;
zhangsan.name="张三";
student[0]=zhangsan;
Studentlisi=newStudent();
lisi.id=1002;
lisi.name="李四";
student[1]=lisi;
●第二种,使用数组的初始化语句,格式为:
数组元素的类型[]变量名称={数组元素1,数组元素2,......数组元素n}或数组元素的类型变量名称[]={数组元素1,数组元素2,......数组元素n}
publicclassArrayTest04{
publicstaticvoidmain(String[]args){
//静态初始化
int[]data={1,2,3,4,5};
for(inti=0;iSystem.out.println(data[i]);
}
Studentzhangsan=newStudent();
zhangsan.id=1001;
zhangsan.name="张三";
Studentlisi=newStudent();
lisi.id=1002;
lisi.name="李四";
//静态初始化
Student[]students={zhangsan,lisi};
for(inti=0;iSystem.out.println("id="+students[i].id+",name="+students[i].name);
}
}
}
classStudent{
intid;
Stringname;
}
2.3、二维数组的声明和使用
1
2
3
4
5
6
二维数组属于多维数组,那么什么是多维数组呢,当数组元素的类型是数组时就成了多维数组,二维数组的声明格式如下:
1.数组元素的数据类型[][]变量名;
2.数组元素的数据类型变量名[][];
其中方括号的个数就是数组的维数,声明二维数组如下:
int[][]data;
在这里介绍三种二维数组的创建方式
1.采用new关键字直接创建
publicclassArrayTest05{
publicstaticvoidmain(String[]args){
//声明二维数组
int[][]data=newint[2][3];
//对二维数组赋值
data[0][0]=1;
data[0][1]=2;
data[0][2]=3;
data[1][0]=4;
data[1][1]=5;
data[1][2]=6;
//输出二维数组
for(inti=0;ifor(intj=0;jSystem.out.println(data[i][j]);
}
}
}
}
int[][]data=newint[2][3];
//对二维数组赋值
data[0][0]=1;
data[0][1]=2;
data[0][2]=3;
data[1][0]=4;
data[1][1]=5;
data[1][2]=6;
2.从高维开始逐维创建
publicclassArrayTest06{
publicstaticvoidmain(String[]args){
//从高维开始逐维创建
int[][]data=newint[2][];
data[0]=newint[2];
data[1]=newint[4];
data[0][0]=1;
data[0][1]=2;
data[1][0]=1;
data[1][1]=2;
data[1][2]=3;
data[1][3]=4;
//输出二维数组
for(inti=0;ifor(intj=0;jSystem.out.println(data[i][j]);
}
}
}
}
3.采用初始化语句块创建数组对象
publicclassArrayTest07{
publicstaticvoidmain(String[]args){
//静态初始化
int[][]data={{1,2},{1,2,3,4}};
for(inti=0;ifor(intj=0;jSystem.out.println(data[i][j]);
}
}
}
}
2.4、数组的排序
2.4.1、冒泡排序
假设有5个数字3,1,6,2,5在一个int数组中,要求按从小到大排序输出
如何采用冒泡排序算法呢?
冒泡排序的算法是这样的,首先从数组的最左边开始,取出第0号位置(左边)的数据和第1号位置(右边)的数据,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。
接下来右移一个位置,取出第1个位置的数据和第2个位置的数据,进行比较,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。
沿着这个算法一直排序下去,最大的数就会冒出水面,这就是冒泡排序。
以上示例排序过程如下:
第一遍排序
3
1
6
2
5
1
3
6
2
5
1
3
6
2
5
1
3
2
6
5
1
3
2
5
6
从上面我们看到了比较了N-1次,那么第二遍就为N-2次比较了,如此类推,比较次数的公式如下:
(N-1)+(N-2)+...+1=((N-1)*N)/2
所以以上总共比较次数为((5-1)*5)/2=10
以上就是冒泡排序算法
publicclassArraySortTest01{
publicstaticvoidmain(String[]args){
int[]data={3,1,6,2,5};
for(inti=data.length-1;i>0;i--){
for(intj=0;j
if(data[j]>data[j+1]){
inttemp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
}
for(inti=0;iSystem.out.println(data[i]);
}
}
}
2.4.2、选择排序
选择排序对冒泡排序进行了改进,使交换次数减少,但比较次数仍然没有减少。
假设有5个数字3,1,6,2,5在一个int数组中,要求按从小到大排序输出
采用选择排序,选择排序是这样的,先从左端开始,找到下标为0的元素,然后和后面的元素依次比较,如果找到了比下标0小的元素,那么再使用此元素,再接着依次比较,直到比较完成所有的元素,最后把最小的和第0个位置交换。
以上示例排序过程如下:
第一遍排序
3
1
6
2
5
3
1
6
2
5
3
1
6
2
5
3
1
6
2
5
1
3
6
2
5
第二遍排序将从下标为1的元素开始,以此类推,经过N(N-1)/2次比较,经过N次数据交互就完成了所有元素的排序。
【示例代码】
publicclassArraySortTest02{
publicstaticvoidmain(String[]args){
int[]data={3,1,6,2,5};
for(inti=0;iintmin=i;
for(intj=i+1;jif(data[j]min=j;
}
}
//进行位置的交换
if(min!
=i){
inttemp=data[i];
data[i]=data[min];
data[min]=temp;
}
}
for(inti=0;iSystem.out.println(data[i]);
}
}
}
2.5、数组的搜索
2.5.1、二分法(折半法)查找
查找数组中的元素我们可以遍历数组中的所有元素,这种方式称为线性查找。
线性查找适合与小型数组,大型数组效率太低。
如果一个数组已经排好序,那么我们可以采用效率比较高的二分查找或叫折半查找算法。
见示例
数值
11
12
13
14
15
16
17
18
19
20
下标
0
1
2
3
4
5
6
7
8
9
假设,我们准备采用二分法取得18在数组中的位置
●第一步,首先取得数组0~9的中间元素
中间元素的位置为:
(开始下标0+结束下标9)/2=下标4
通过下标4取得对应的值15
18大于15,那么我们在后半部分查找
●第二步,取数组4~9的中间元素
4~9的中间元素=(下标4+1+下标9)/2=下标7
下标7的值为18,查找完毕,将下标7返回即可
以上就是二分或折半查找法,此种方法必须保证数组事先是排好序的,这一点一定要注意
【示例代码】
publicclassBinarySearchTest01{
publicstaticvoidmain(String[]args){
int[]data={11,12,13,14,15,16,17,18,19,20};
intindex=binarySearch(data,18);
System.out.println(index);
}
//采用折半法查询,必须建立在排序的基础上
privatestaticintbinarySearch(int[]data,intvalue){
//开始下标
intbeginPos=0;
//结束下标
intendPos=data.length-1;
while(beginPos<=endPos){
intmidPos=(beginPos+endPos)/2;
if(value==data[midPos]){
returnmidPos;
}elseif(value>data[midPos]){
beginPos=midPos+1;
}elseif(valueendPos=midPos-1;
}
}
return-1;
}
}
2.6、Arrays工具类
了解sort、fill和binarySearch
2.6.1、Arrays.sort的使用
importjava.util.Arrays;
publicclassArraysUtilTest01{
publicstaticvoidmain(String[]args){
int[]data={3,1,6,2,5};
Arrays.sort(data);
for(inti=0;iSystem.out.println(data[i]);
}
System.out.println("----------------");
for(inti=data.length-1;i>=0;i--){
System.out.println(data[i]);
}
}
}
2.6.2、Arrays.binarySearch的使用
importjava.util.Arrays;
publicclassArraysUtilTest02{
publicstaticvoidmain(String[]args){
int[]data={3,1,6,2,5};
Arrays.sort(data);
for(inti=0;iSystem.out.println(data[i]);
}
System.out.println("");
intindex=Arrays.binarySearch(data,3);
System.out.println("index="+index);
}
}