05数组.docx
- 文档编号:4662076
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:151.15KB
05数组.docx
《05数组.docx》由会员分享,可在线阅读,更多相关《05数组.docx(21页珍藏版)》请在冰豆网上搜索。
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;i System.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;i System.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;i System.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;i System.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;i for(intj=0;j System.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;i for(intj=0;j System.out.println(data[i][j]); } } } } 3.采用初始化语句块创建数组对象 publicclassArrayTest07{ publicstaticvoidmain(String[]args){ //静态初始化 int[][]data={{1,2},{1,2,3,4}}; for(inti=0;i for(intj=0;j System.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;i System.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;i intmin=i; for(intj=i+1;j if(data[j] min=j; } } //进行位置的交换 if(min! =i){ inttemp=data[i]; data[i]=data[min]; data[min]=temp; } } for(inti=0;i System.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(value endPos=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;i System.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;i System.out.println(data[i]); } System.out.println(""); intindex=Arrays.binarySearch(data,3); System.out.println("index="+index); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 数组
![提示](https://static.bdocx.com/images/bang_tan.gif)