您好,欢迎访问三七文档
第(1)页共(20)页1、课程名称:数组的定义及使用2、知识点2.1、上次课程的主要知识点1、类与对象的组成以及加强;2、简单Java类开发。2.2、本次预计讲解的知识点1、数组的基本定义;2、数组的使用;3、数组与方法间的互操作;4、数组有关的操作类库支持。3、具体内容(★★★★☆)所有的开发之中都一定要使用到数组,但是数组没有讲解的这么复杂。之所以本次要讲解的比较多,主要是为了防止笔试中出现的问题。第(2)页共(20)页3.1、数组的基本概念数组指的是一组相关变量的集合。如果说现在要求你定义100个整型变量,那么按照最原始的方式则肯定这样定义:inti1;inti2;...inti100;这种操作可以实现要求,但是这些变量的关联实在是太麻烦了。为此在开发之中可以利用数组来解决这一问题。在Java中数组属于引用数据类型,既然是引用数据类型就牵扯到内存的关系。对于数组的定义语法有以下两种形式:·声明并开辟数组:数据类型数组名称[]=new数据类型[长度];数据类型[]数组名称=new数据类型[长度];·分步完成:|-声明数组:数据类型数组名称[]=null;数据类型[]数组名称=null;|-开辟数组:数组名称=new数据类型[长度];当数组开辟空间之后那么就可以采用“数组[索引]”的形式进行数组的访问,但是需要注意的是,如果现在数组的长度为3,那么索引的范围:0~2(一共3个元素)。如果操作中超过了数组的允许索引范围,则程序在运行过程之中会出现“ArrayIndexOutOfBoundsException”(数组索引超出绑定异常,数组越界)。以上的操作属于数组的动态初始化,动态初始化的特点,是数组开辟空间之后,数组中每个元素的内容都是其对应数据类型的默认值。范例:定义数组publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[3];//开辟了一个data数组,长度为3System.out.println(data[0]);System.out.println(data[1]);System.out.println(data[2]);}}范例:数组的赋值操作第(3)页共(20)页publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[3];//开辟了一个data数组,长度为3data[0]=10;//为数组赋值data[1]=20;data[2]=30;System.out.println(data[0]);System.out.println(data[1]);System.out.println(data[2]);}}但是现在数组本身是一种顺序式的结构,所以在进行数组内容输出的时候,往往可以采用循环的方式完成。由于数组的长度是固定的,所以只要是进行数组的输出那么都会考虑使用for循环,这里面就牵扯到了一个数组长度的取得,在Java中可以使用“数组对象.length”属性取得。范例:数组输出publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[3];//开辟了一个data数组,长度为3System.out.println(data.length);data[0]=10;//为数组赋值data[1]=20;data[2]=30;for(intx=0;xdata.length;x++){System.out.print(data[x]+、);}}}第(4)页共(20)页3.2、数组的引用分析引用数据类型的分析过程几乎都是一样的,所以数组的引用分析其本质也是一样的,与对象的流程是相同的,以下面的代码为例。publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[3];//开辟了一个data数组,长度为3System.out.println(data.length);data[0]=10;//为数组赋值data[1]=20;data[2]=30;for(intx=0;xdata.length;x++){System.out.print(data[x]+、);}}}第(5)页共(20)页以上的流程与普通对象本质上是没有什么区别的,唯一的区别是在于普通的类对象是保存属性,利用属性名称来操作,但是数组保存的是一组内容,利用索引来操作。那么既然此关系可以弄明白,所谓的分步的操作也就一样的过程。范例:分步实例化数组对象publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=null;//只有声明的时候加上“[]”data=newint[3];//开辟了一个data数组,长度为3System.out.println(data.length);data[0]=10;//为数组赋值data[1]=20;data[2]=30;for(intx=0;xdata.length;x++){System.out.print(data[x]+、);}}}第(6)页共(20)页那么现在如果此关系可以明白的话,就意味着可以进行数组的引用操作了。引用的本质同一块堆内存空间被不同的栈内存所指向。范例:数组的引用操作publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[3];//开辟了一个data数组,长度为3data[0]=10;//为数组赋值data[1]=20;data[2]=30;inttemp[]=data;//引用操作temp[0]=100;//修改数据for(intx=0;xdata.length;x++){System.out.print(data[x]+、);}}}还是通过内存关系图来进行操作描述。第(7)页共(20)页3.3、数组的静态初始化以上是针对于数组的动态初始化操作讲解的,动态初始化操作的特点在于其只能够在开辟数组空间之后进行数组内容的赋值,如果现在希望数组开辟之后就可以存在明确的内容,那么则可以使用数组的静态初始化,而语法有如下两种:第一种:简化型数据类型数组名称[]={值,值,...};数据类型[]数组名称={值,值,...};第二种:完全型(推荐使用)数据类型数组名称[]=new数据类型[]{值,值,...};数据类型[]数组名称=new数据类型[]{值,值,...};范例:使用数组的静态初始化publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[]=newint[]{10,20,30};//数组的静态初始化for(intx=0;xdata.length;x++){System.out.print(data[x]+、);}}}第(8)页共(20)页范例:判断某一个数字是否在数组中存在?最简单的做法是进行for循环操作,一次与每一个数组中的内容进行相等比较。publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intsdata=11;//要查找的数据booleanflag=false;//保存查找结果,如果找到了修改为trueintdata[]=newint[]{10,20,30,11,22,33};for(intx=0;xdata.length;x++){if(data[x]==sdata){//现在已经查找到了内容flag=true;break;//退出循环}}if(flag){System.out.println(该数据已经查找到!);}else{System.out.println(该数据没有查找到!);}}}但是严格来讲现在这样的代码性能并不好,因为它需要将数组中的每一个元素都进行判断。面试题:请解释什么叫二分查找法(折半查找法)二分查找法的重要支持:数组中的数据必须是有序的。第(9)页共(20)页publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intsdata=161;intdata[]=newint[]{10,20,30,40,50,60};System.out.println(search(sdata,data));}publicstaticbooleansearch(intsdate,int[]data){System.out.print(java.util.Arrays.toString(data)+len=);if(data.length==1){returnsdate==data[0];}else{intlen=data.length/2;//012=1、01=1System.out.println(len+,+(sdate==data[len]));if(sdatedata[len]){//右边,取出新的数组数据int[]temp=null;if(data.length%2==0){temp=newint[len];}else{temp=newint[len+1];}intfoot=0;for(intx=len;xdata.length;x++){temp[foot++]=data[x];}returnsearch(sdate,temp);}elseif(sdatedata[len]){//左边int[]temp=newint[len];for(intx=0;xlen;x++){第(10)页共(20)页temp[x]=data[x];}returnsearch(sdate,temp);}else{//等于returnsearch(sdate,newint[]{data[len]});}}}}这种代码只是一个娱乐。3.4、二维数组(理解)在开发之中,之前使用的数组只有一个索引下标,所以可以简单将其理解为是一个一维数组。一维数组的特点是可以根据一个索引号确定内容,好比如下形式:索引号012345数据902127786767二维数组实际上与数据表的形式是完全相同的,有行和列组成,那么要想确认一个数据,必须有行和列的编号,所以二维数组的组成如下:行索引、列索引列索引0列索引1列索引2列索引3列索引4行索引0534347行索引1347342346行索引2686987344现在要想确定987这个数据,那么就需要行索引为2,列索引也为2才可以定位到。对于二维数组的定义有两种语法结构:·动态初始化:数据类型数组名称[][]=new数据类型[行个数][列个数];·静态初始化:数据类型数组名称[][]=new数据类型[][]{{数据,数据,数据},{数据,数据,数据},...};实际上可以发现,二维数组的本质就是在数组里面继续嵌套了其他的数组。范例:观察二维数组使用publicclassArrayDemo{//程序必须有类publicstaticvoidmain(Stringargs[]){intdata[][]=newint[][]{{1,2},{4,5,6},{7,8,9,10}};for(intx=0;xdata.length;x++){//控制数组行for(inty=0;ydata[x].length;y++){System.out.print(data[x][y]+、);}System.out.println();}}第(11)页共(20)页}面试题:实现二维数组转置publicclassArrayDemo{//程序必须有类pub
本文标题:数组的定义及使用
链接地址:https://www.777doc.com/doc-2335951 .html