《第6章数组枚举及注解.ppt》由会员分享,可在线阅读,更多相关《第6章数组枚举及注解.ppt(36页珍藏版)》请在优知文库上搜索。
1、Java实用教程(第3版)第第6章章 数组、枚举及注解数组、枚举及注解T6.1 一维数组一维数组T6.2 多维数组多维数组T6.3 访问数组访问数组T6.5 枚举枚举T6.6 enum的构造方法的构造方法T6.7 使用使用EnumMapT6.8 注解注解T6.9 内置注解内置注解T6.10 元注解元注解T6.11 综合实例综合实例T6.4 数组实用类数组实用类ArraysJava实用教程(第3版)6.1 一维数组一维数组1一维数组的定义一维数组的定义一维数组的定义格式有如下两种:方式1:;方式2:;其中:可以是Java中任意的数据类型,为用户自定义的一个合法的变量名,指明该变量是一个数组类型变
2、量。Java在定义数组时并不为数组元素分配内存,仅为分配一个引用变量的空间。例如下面的语句:int a;String person;int b100;/错误,声明数组时不能指定其长度2创建一维数组对象创建一维数组对象和创建其他Java对象一样,同样使用new关键字创建一维数组对象,格式为:数组名=new 元素类型 元素个数;例如下面的语句:int Array=new int100;/创建一个int型数组,存放100个int类型的数据Java实用教程(第3版)6.1 一维数组一维数组Java虚拟机首先在堆区中为数组分配内存空间,如图6.1所示,创建了一个包含100个元素的int型数组,数组成员都
3、是int类型,占4个字节,因此整个数组对象在堆区中占用400个字节。之后,就要给每个数组成员赋予其数据类型的默认值,int型的默认值是0。图图6.1 一维数组的内存布局一维数组的内存布局Java实用教程(第3版)6.1 一维数组一维数组3.一维数组初始化一维数组初始化定义数组的同时也可对数组元素进行显式初始化,有动态初始化和静态初始化。静态初始化指的是在定义数组的同时就为数组元素分配空间并赋值,它的格式如下:=,;或者 =,;Java编译程序会自动根据个数算出整个数组的长度,并分配相应的空间,例如下面的语句:int Array=1,2,3,4;Java实用教程(第3版)6.1 一维数组一维数组
4、数组成员是引用类型的也可静态初始化,如图6.2所示。Point pa=new Point(1,4),new Point(3,9),new Point(15,18);class Point int x,y;Point(int a,int b)x=a;y=b;图图6.2 引用类型数组的内存布局引用类型数组的内存布局Java实用教程(第3版)6.1 一维数组一维数组动态初始化指的是数组定义与为数组分配空间和赋值的操作分开进行,例如下面的语句:int a =new int3;a0=1;a1=5;a2=9;同样,数组成员是引用类型的也可动态初始化,例如下面的语句:Point pa=new Point3;
5、pa0=new Point(1,4);pa1=new Point(3,9);pa2=new Point(15,18);/或采用匿名数组写法/Point pa=new Point(1,4),new Point(3,9),new Point(15,18);class Point int x,y;Point(int a,int b)x=a;y=b;Java实用教程(第3版)6.1 一维数组一维数组【例例6.1】输入一组非0整数到一维数组中,设计一个Java程序,求出这一组数的平均值,并分别统计出这一组数中正数和负数的个数。TestAverage.javapackage org.arrays;publ
6、ic class TestAverage public static void main(String args)int i=args.length;/获取命令行参数的长度int arr=new int10;int num=0;int k=0;int p=0;for(int j=0;ji;j+)arrj=Integer.parseInt(argsj);if(arrj 0)k+;/负数的个数加一elsep+;/正数的个数加一num=num+arrj;/计算累加和System.out.println(正数的个数+p);System.out.println(负数的个数+k);System.out.p
7、rintln(平均值是+num/i);/计算平均值Java实用教程(第3版)6.1 一维数组一维数组右击“TestAverage.java”,选择“Run As”“Run Configurations”,如图6.3所示,选择Main标签页,在“Project”栏中选择“MyProject_06”,在“Main class”栏中选择“Recurrence”,选择“Arguments”标签页,在“Program argumentds”栏中输入“3 8 4-5 6 7 8-4 11 12”,然后单击“Run”按钮,运行程序。程序运行结果:正数的个数8负数的个数2平均值是5图图6.3 计算平均值计算平
8、均值Java实用教程(第3版)6.2 多维数组多维数组如前所述,在Java语言中,多维数组实际上是数组的数组。一个二维数组可以看成是一维数组,其中的每个成员又是一维数组。1二维数组的定义二维数组的定义二维数组的定义格式如下:格式1:;格式2:;与一维数组的情形相类似,定义二维数组时不需要给出数组大小。int a;String names;int b100100;/错误,声明数组时不能指定其长度2创建二维数组对象创建二维数组对象和创建一维数组一样,创建二维数组同样使用new关键字,格式如下:数组名=new 数组元素类型 数组元素个数 数组元素个数;例如下面的语句:int a=new int2 3
9、;/创建一个int型的二维数组Java实用教程(第3版)6.2 多维数组多维数组和一维数组一样,若没有对二维数组成员进行显式初始化,则会进行隐式初始化,会根据创建的数组类型初始化对象,内存布局如图6.4所示。图图6.4 二维数组的内存布局二维数组的内存布局Java实用教程(第3版)6.2 多维数组多维数组3.二维数组初始化二维数组初始化和一维数组一样,定义二维数组的同时也可对数组成员进行显式初始化,有动态初始化和静态初始化。在下面的语句中,定义String类型数组alphabet的同时初始化数组成员,即静态初始化。String alphabet=a,b,c,d,e,f,g,h,i,j,k,l;
10、注意:注意:无论是初始化一维数组还是二维数组,都不能指定其长度。例如下面的语句:String43 alphabet=a,b,c,d,e,f,g,h,i,j,k,l;/错误二维数组的第二维的长度可以各不相同,例如下面的语句:String alphabet=a,b,c,d,e,f,g,h,i,j,k;Java实用教程(第3版)6.2 多维数组多维数组和一维数组一样,二维数组成员是引用类型的,也可静态初始化。下面的代码片段创建的引用类型的二维数组的内存布局如图6.5所示。Point pt=new Point(1,2),new Point(3,4),new Point(5,6),new Point(7
11、,8),new Point(9,10),new Point(11,12);class Point int x,y;Point(int a,int b)x=a;y=b;图图6.5 二维数组引用类型的内存布局二维数组引用类型的内存布局 Java实用教程(第3版)6.2 多维数组多维数组二维数组的动态初始化有两种方式:方式1:=new;例如:int arr=new int35;方式2:从高维向低维依次进行空间分配,此时分配的数组空间可以是任意的形状。(1)由于二维数组首先是一个一维数组,故先对该一维数组进行空间分配,也就是说,先对最高维进行空间分配。=new;例如:int c=new int3;(2
12、)每一个元素又是一个一维数组,故对每一个元素再用new语句进行空间分配,格式与一维数组相同。例如下面的语句:c0=new int4;c1=new int3;c2=new int5;Java实用教程(第3版)6.2 多维数组多维数组(3)若最终元素是引用类型,则还需对每一个最终元素进行对象的空间分配。例如下面的语句:Point p;/定义一个二维数组的引用变量p=new Point3;/先作为一维数组,进行最高维空间的分配p0=new Point2;/每一个元素又是一个一维数组,再进行一维数组空间分配p1=new Point1;p2=new Point2;p00=new Point(1,1);p
13、01=new Point(2,2);/最后对每一个元素进行Point对象空间的分配p10=new Point(3,3);p20=new Point(4,4);p21=new Point(5,5);class Point int x,y;Point(int a,int b)x=a;y=b;【例例6.2】设计一个Java程序,从低到高将从命令行中读取的一组数字进行升序排列。Java实用教程(第3版)6.2 多维数组多维数组右击“NumSort.java”,选择“Run As”“Run Configurations”,如图6.6所示,选择Main标签页,在“Project”栏中选择“MyProjec
14、t_06”,在“Main class”栏中选择“NumSort”,选择“Arguments”标签页,在“Program argumentds”栏中输入“12 5 78 45 17 6 8 13 32 14”,然后单击“Run”按钮,运行程序。图图6.6 对数值按从小到大排序对数值按从小到大排序Java实用教程(第3版)6.3 访问数组访问数组数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素的索引为0,第二个元素的索引为1,依次类推。数组的length属性表示数组的长度,它的声明形式如下:public final int length;length属性被public和final修饰
15、,因此在程序中可以读取数组的长度,但不能修改数组的长度。【例例6.3】求出4阶矩阵的最大元素以及其所在的行号和列号。【例例6.4】将一个3 4阶矩阵转置。矩阵转置就是将一个矩阵的行、列互换。Java实用教程(第3版)6.4 数组实用类数组实用类:Arrays6.4.1 复制数组复制数组java.lang.System类提供了一个很有用的静态方法arraycopy()用来复制数组,其语法格式如下:static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)功能:从指定源数组中复制一个数组,复制从指定
16、的位置开始,复制到目标数组的指定位置。从 src引用的源数组到dest引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的数量等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。【例例6.5】使用arraycopy()方法把数组的内容复制到另一个数组。Java实用教程(第3版)6.4.2 数组排序数组排序使用内置的排序方法,就可以对任意基本类型数组排序,也可以对任意的对象数组进行排序,只要该对象实现了Comparable接口或具有相关联的Comparator。当然,可以对数组按指定的排序方法进行排序。【例例6.6】随机生成10个整数值,并使用内置的排序方法对数组排序。Java实用教程(第3版)6.4.3 数组元素的查找数组元素的查找如果数组已经排好序了,就可以使用Array.binarySearch()执行快速查找。【例例6.7】对无序的10个整数值进行排序,再用二叉查找法进行检索。Java实用教程(第3版)6.5 枚举枚举JDK5.0引入了一个新的关