收藏 分享(赏)

第五章数组.ppt

上传人:j35w19 文档编号:8229325 上传时间:2019-06-15 格式:PPT 页数:49 大小:622KB
下载 相关 举报
第五章数组.ppt_第1页
第1页 / 共49页
第五章数组.ppt_第2页
第2页 / 共49页
第五章数组.ppt_第3页
第3页 / 共49页
第五章数组.ppt_第4页
第4页 / 共49页
第五章数组.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、第五章 数组数组是常用的数据结构,相同数据类型的元素按一定顺序线性排列就构成了数组。在Java中数组的元素可以是简单数据类型的量,也可以是某一类的对象。数组的主要特点如下:(1) 数组是相同数据类型的元素的集合。(2) 数组中的各元素是有先后顺序的。它们在内存中按照这个顺序连续存放在一起。(3) 每个数组元素用整个数组的名字和它自己在数组中的位置表达。例如a0代表数组a的第一个元素,a1代表数组a的第二个元素,依此类推。,Java程序中定义数组的操作与其他语言相比有一定的差异,一般说来创建一个Java数组需要下面三个步骤。,1. 声明数组声明数组主要是声明数组的名称和数组所包含的元素的数据类型

2、或元素的类名。声明数组的语法格式有两种。数组元素类型 数组名 ;数组元素类型 数组名;方括号 是数组的标志,它可以出现在数组名的后面,也可以出现在数组元素类型名的后面,两种定义方法没有什么差别。下面的例子分别声明了一个整型的数组和一个D200-Card类型的数组:int MyIntArray ;D200-Card ArrayOf200Card ;,2. 创建数组空间声明数组仅仅指定了数组的名字和数组元素的类型,要想真正使用数组还需要为它开辟内存空间,即创建数组空间。与多数语言一样,Java不支持变长的数组(一个变通的方法是利用Vector类来实现变长数组,参见下一小节),所以在创建数组空间时必

3、须指明数组的长度,以确定所开辟的内存空间的大小。创建数组空间的语法格式为:数组名 = new 数组元素类型 数组元素的个数 ;上面声明的两个数组可以这样创建空间: MyIntArray = new int 10 ;ArrayOf200Card = new D200-Card 15 ;,创建数组空间的工作也可以与声明数组合在一起,用一条语句完成。例如:int MyIntArray = new int 10 ;D200-Card ArrayOf200Card = new D200-Card 15 ; 对于数组元素类型是基本数据类型的数组,在创建数组空间的同时,还可以同时给出各数组元素的初值,这样可

4、以省略创建空间的new算符。例如:int MyIntArray=1,2,3,4,5,6,7,8,9,10;这个语句创建了一个包含10个整型元素的数组,同时给出了每个元素的初值。,3. 创建数组元素并初始化如果数组元素的类型是基本数据类型,那么这第三个步骤可以自行省略。因为基本数据类型量都有缺省的初值,可以没有专门的创建和初始化数组元素的语句。例如上面的数组MyIntArray,如果不专门指定初值,那么创建之后,它的每个数组元素都被自动赋值为0,不必再加后续步骤。对于以某一类对象为数组元素的数组,创建并初始化每个数组元素的步骤却是必不可少的。例如上面的数组ArrayOf200Card,它的每个元

5、素都是一个D200-Card类的对象,在创建对象的同时必须要执行该对象的构造函数。,例如,D200-Card类的对象的构造函数为: D200-Card ( long cn, int pw, double b, String c, double a )cardNumber = cn;password = pw;balance = b;connectNumber = c;additorFee = a;,可见每创建一个D200-Card类的对象,都必须执行这个类的构造函数并给出相应的实际参数来初始化新对象内部各个属性变量或对象,所以对于数组ArrayOf200Card中的每个元素,必须用一条专门的语

6、句来实现创建该元素和执行构造函数初始化该元素的工作,一般用如下的循环完成。 for ( int i = 0 ; i ArrayOf200Card . length ; i + )ArrayOf200Card i = new D200-Card ( 200180000+i,1111,50.0,200,0.1 ) ;,这个循环执行的结果将为从ArrayOf200Card 0到ArrayOf200Card 14的所有数组元素开辟并分配内存空间。语句中使用的ArrayOf200Card.length是数组ArrayOf200Card的一个整型域,里面保存着数组中元素的个数,用来作为循环终止条件非常合适

7、。 只有在完成了所有数组元素的创建和初始化工作之后,才可以在程序中使用这些数组元素,如引用或修改其属性、调用其方法等。如果强行使用未经上述步骤初始化的数组,就会出现NullPointException的异常错误。,从上面初始化数组元素的代码中,还可以引出使用Java数组时需要注意的几个问题:(1) 数组元素的下标(即数组元素方括号内的数字,代表了数组元素在数组中的位置)从0开始,直到数组元素个数减1为止。例如长度为10的数组,其元素下标为09。数组的下标必须是整型或者可以转化成整型的量。(2) 所有的数组都有一个属性length,这个属性存储了数组元素的个数,利用它可以方便地完成许多操作。,(

8、3) Java系统能自动检查是否有数组下标越界的情况。例如数组MyIntArray的长度为10,包含10个元素,下标分别为09。如果在程序中使用MyIntArray10,就会发生数组下标越界,此时Java系统会自动终止当前的流程,并产生一个名为ArrayIndexOutOfBoundsException的例外,通知使用者出现了数组下标越界。避免这种情况的一个有效方法是利用上面提到的length属性作为数组下标的上界。,最后需要指出的是,Java中的数组实际上是一种隐含的“数组类”的实例。每个数组名实际是该实例的一个引用,而数组的每个元素也是对数组元素类实例的引用,数组的引用和数组元素的引用都需

9、要实例化。了解了这一点,就不难理解为什么建数组时要有创建数组和创建数组元素两个步骤了。,5.6 字符串字符串是编程中经常要使用到的数据结构。它是字符的序列,从某种程度上来说有些类似于字符的数组。实际上在有些语言(如C语言)中,字符串就是用字符数组来实现的。而在Java这个面向对象的语言中,字符串,无论是常量还是变量,都是用类的对象来实现的。,程序中需要用到的字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串变量。对于字符串常量,由于程序中经常需要对它做比较、搜索之类的操作,所以通常把它放在一个具有一定名称的对象之中,由程序对该对象完成

10、上述操作。在Java中,存放字符串常量的对象属于String类。对于字符串变量,由于程序中经常需要对它做添加、插入、修改之类的操作,所以一般都存放在StringBuffer类的对象中。,5.6.1 String类字符串常量用String类的对象表示。在前面的程序中,已多次使用了字符串常量。这里首先强调一下字符串常量与字符常量的不同。字符常量是用单引号括起的单个字符,例如a,n等。而字符串常量是用双引号括起的字符序列,例如a,n,Hello等。Java中的字符串常量,表面上与其他语言中的字符串常量没有什么不同,但在具体实现上却有较大的差异。例如,C语言中的字符串是由字符数组组成的,每个字符串的结

11、尾用0标志。而Java的字符串常量,通常是作为String类的对象存在,有专门的属性来规定它的长度。,实际上,对于所有用双引号括起的字符串常量,系统都会为它创建一个无名的String类型对象。本节将主要讨论存放字符串常量的String类,包括String对象的创建、使用和操作。 1. 创建字符串常量String对象由于String类的对象表示的是字符串常量,所以一般情况下,一个String字符串一经创建,无论其长度还是内容,都不能够再更改了。因而,在创建String对象时,通常需要向String类的构造函数传递参数来指定所创建的字符串的内容。下面简单列出String类的构造函数及其使用方法。,

12、(1) public String( )这个构造函数用来创建一个空的字符串常量。 (2) public String(String value)这个构造函数利用一个已经存在的字符串常量创建一个新的String对象,该对象的内容与给出的字符串常量一致。这个字符串常量可以是另一个String对象,也可以是一个用双引号括起的直接常量。 (3) public String(StringBuffer buffer)这个构造函数利用一个已经存在的StringBuffer对象为新建的String对象初始化。StringBuffer对象代表内容、长度可改变的字符串变量,将在下一节介绍。,(4) public

13、String(char value)这个构造函数利用已经存在的字符数组的内容初始化新建的String对象。了解了String类的构造函数之后,让我们来看几个创建String对象的例子。创建String对象与创建其他类的对象一样,分为对象的声明和对象的创建两步。这两步可以分成两个独立的语句,也可以在一个语句中完成。例如下面的句子仅声明一个String对象s:String s ;,此时s的值为null,要想使用s,还必须为它开辟内存空间。s = new String (ABC) ; 这样,通过调用上面的第二种构造函数,字符串s被置为ABC。上述两个语句也可以合并成一个语句如下: String s

14、= new String ( ABC ) ;在Java中,还有一种非常特殊而常用的创建String对象的方法。这种方法直接利用双引号括起的字符串常量为新建的String对象“赋值”:String s = ABC ;,其实这里的“赋值”只是一种特殊的省略写法,前面已经提到,Java系统会自动为每一个用双引号括起的字符串常量创建一个String对象,所以这个语句的实际含义与效果与前一个句子完全一致。 2. 字符串常量的操作String类中所包含的字符串常量的操作有很多,如:求字符串的长度。具体方法如下:public int length ( ) ;用它可以获得当前字符串对象中字符的个数。例如运行下

15、面的代码:String s = Hello!System . out . println ( s . length ( ) ) ;,屏幕将显示6,因为字符串“Hello!”的长度为6。需要注意的是在Java中,因为每个字符都是占用16个比特的Unicode字符,所以汉字与英文或其他符号相同,也只用一个字符表示就足够了。如果把上面句子中的字符串替换成“近来身体好吗”,则字符串的长度不变,仍然是6。 3. 判断字符串的前缀和后缀public boolean startsWith(String prefix);public boolean endsWith(String suffix);这两个方法可

16、以分别判断当前字符串的前缀和后缀是否是指定的字符子串。,区分字符串的前缀及后缀在某些情况下是非常有用的操作。例如,假设电话局老用户的电话号码都以字符子串“6278”开始,新用户的电话号码都以“8278”开始。如果电话局需要将老用户和新用户区分开,则可以采用如下语句: String s=User . getPhone ( ) ;/ 设User是电话局用户对象,getPhone( )是该对象的if ( s . startsWith ( 6278 ) )/ 返回自身电话号码的方法,电话号码是String对象 ,又例如,居民身份证号码的最后一个数字代表了居民的性别,奇数为男性,偶数为女性。假设Stri

17、ng对象s是某位居民的身份证号码,则下面的语句将判断出他的性别:if (s. endsWith(0) | s.endsWith(2) | s.endsWith(4) | s.endsWith(6)| s.endsWith(8) System . out. println ( 此人是女性 ) ; startsWith和endsWith这两个方法的一个突出优点是不限制所判断的前缀、后缀的长度。例如前一个例子中若需判断的前缀从“6278”变换到“627”,则原方法仍然有效,不需要更改程序。,4. 字符串中单个字符的查找public int indexOf(int ch);public int ind

18、exOf(int ch, int fromIndex);上述两个方法查找当前字符串中某特定字符出现的位置。第一个方法查找字符ch在当前字符串中第一次出现的位置,即从头向后查找,并返回字符ch出现的位置。如果找不到则返回-1。例如下面的语句将把值0赋给整型量idx:String s = Java是面向对象的语言,JavaScript是脚本语言;int idx = s . indexOf ( (int)J ) ;,第二个方法查找字符ch时,在当前字符串中自fromIndex位字符之后向后查找,并返回该字符首次出现的位置。下面的语句将查找出指定字符在字符串中的所有出现位置:String s = Ja

19、va是面向对象的语言,JavaScript是脚本语言;int i= -1;do i = s . indexOf ( (int)a, i+1 ) ;System . out . print ( i + t) ;while(i!=-1);运行结果是: 1 3 14 16 -1,下面的两个方法也是查找字符串中单个字符的方法,不同的是它们是从字符串的结尾向字符串的开始部分查找,这里就不再举例了。public int lastIndexOf(int ch);public int lastIndexOf(int ch, int fromIndex);,5. 字符串中子串的查找public int inde

20、xOf(String str);public int indexOf(String str, int fromIndex);public int lastIndexOf(String str); public int lastIndexOf(String str, int fromIndex); 在字符串中查找字符子串与在字符串中查找单个字符非常相似,也有四种可供选用的方法,它就是把查找单个字符的四个方法中的指定字符ch换成了指定字符子串str。下面的例子从字符串尾部向前,顺序查找到所有子串出现的位置:,String s = Java是面向对象的语言,JavaScript是脚本语言 ;Stri

21、ng sub = 语言;for ( int i = s.length( ) ; i != -1 ; )i = s . lastIndexOf ( sub, i - 1 ) ;System . out . print ( i + t) ;上述程序运行的结果是:26 10 -1另外,还定义有获取字符串中的某个字符的方法: public char charAt(int index);这个方法获取当前字符串中第index个字符并返回这个字符(index从0算起)。,6. 比较两个字符串public int compareTo(String anotherString);public boolean e

22、quals(Object anObject);public boolean equalsIgnoreCase(String anotherString);String类中有三个方法可以比较两个字符串是否相同。方法equals是重载Object类的方法,它将当前字符串与方法的参数列表中给出的字符串相比较,若两字符串相同,则返回真值,否则返回假值。方法equalsIgnoreCase与方法equals的用法相似,只是它比较字符串时将不计字母大小写的差别。,例如,在下面的语句中,分别用equals方法和equalsIgnoreCase方法比较两字符串,则在第一个语句中由于区分大小写,所以比较结果为假

23、;而在第二个语句中由于不区分大小写,所以比较结果为真:String s1 = Hello!World ; s2 = hello!world ;boolean b1 = s1 . equals ( s2 );boolean b2 = s1 . equalsIgnoreCase ( s2 ) ;,比较字符串的另一个方法是compareTo( ),这个方法将当前字符串与一个参数字符串相比较,并返回一个整型量。如果当前字符串与参数字符串完全相同,则compareTo( )方法返回0;如果当前字符串按字母序大于参数字符串,则compareTo( )方法返回一个大于0的整数;反之,若compareTo(

24、)方法返回一个小于0的整数,则说明当前字符串按字母序小于参数字符串。在下面的例子中,compareTo比较了三对字符串。,String s = abc, s1 = aab, s2 = abd, s3 = abc;int i, j, k ;i = s . compareTo ( s1 ) ;j = s . compareTo ( s2 ) ;k = s . compareTo ( s3 ) ; 语句执行的结果是分别给i,j,k三个变量赋值为1,-1,0。,7. 连接字符子串public String concat(String str);这个方法将参数字符串连接在当前字符串的尾部,并返回这个连接

25、而成的长字符串,但是当前字符串本身并不改变。如下面的例子:String s = Hello! ;System . out. println ( s . concat ( World! ) ) ;System .out . println ( s );运行结果是:Hello!World! / 连接后的新字符串Hello! / 原字符串没有改变,5.6.2 StringBuffer类Java中用来实现字符串的另一个类是StringBuffer类,与实现字符串常量的String类不同,StringBuffer类的每个对象都是可以扩充和修改的字符串变量。 1. 创建字符串变量StringBuffer对

26、象由于StringBuffer表示的是可扩充、修改的字符串,所以在创建StringBuffer类的对象时并不一定要给出字符串初值。 StringBuffer类的构造函数有以下几个:,public StringBuffer( ); public StringBuffer(int length); public StringBuffer(String str);第一个函数创建了一个空的StringBuffer对象。第二个函数给出了新建的StringBuffer对象的长度,第三个函数则利用一个已经存在的字符串String对象来初始化StringBuffer对象。下面的语句是用三种不同方法创建字符串的

27、例子。 StringBuffer MyStrBuff1 = new StringBuffer( ) ; StringBuffer MyStrBuff2 = new StringBuffer( 5 ) ;StringBuffer MyStrBuff3 = new StringBuffer( Hello,Guys!) ;,需要注意的是,其中第一个对象MyStrBuff1并没有相应的内存单元,需扩充之后才能使用。 2. 字符串变量的扩充、修改与操作StringBuffer类有两组用来扩充其中所包含的字符的方法,分别是:public StringBuffer append( 参数对象类型 参数对象名)

28、 ;public StringBuffer insert( int 插入位置,参数对象类型 参 数对象名) ;,append方法将指定的参数对象转化成字符串,附加在原StringBuffer字符串对象之后,而insert方法则在指定的位置插入给出的参数对象所转化而得的字符串。附加或插入的参数对象可以是各种数据类型的数据,如int, double, char, String等。例:StringBuffer MyStrBuff1 = new StringBuffer( ) ;MyStrBuff1 . append ( Hello, Guys!) ; System . out . println (

29、 MyStrBuff1.toString ( ) ) ;MyStrBuff1 . insert ( 6, 30 ) ; System . out . println ( MyStrBuff1.toString ( ) ) ;上述程序执行的结果是:Hello, Guys!Hello,30 Guys!,需要注意的是,若希望将StringBuffer在屏幕上显示出来,则必须首先调用toString方法把它变成字符串常量,因为PrintStream的方法println( )不接受StringBuffer类型的参数。StringBuffer还有一个较有用的方法用来修改字符串:public void se

30、tCharAt(int index, char ch);这个方法可以将指定位置处的字符用给定的另一个字符来替换。例如下面的语句将把原意为“山羊”的字符串变换成“外套”:StringBuffer MyStrBuff = new StringBuffer ( goat ) ;MyStrBuff.setCharAt ( 0, c) ;,3. 字符串的赋值和加法字符串是经常使用的数据类型,为了编程方便,Java编译系统中引入了字符串的加法和赋值。参看下面的例子:String MyStr = Hello, ;MyStr = MyStr + Guys! ; 这两个语句初看似乎有问题,因为String是不可

31、变的字符串常量,实际上它们是合乎语法规定的,分别相当于:,String MyStr = new StringBuffer( ).append(Hello).toString( );MyStr = new StringBuffer( ).append(MyStr).append(Guys!).toString( ); 由于这种赋值和加法的简便写法非常方便实用,所以在实际编程中用得很多。,5.6.3 Java Application命令行参数 Java Application是用命令行来启动执行的,命令行参数就成为向Java Application传入数据的常用而有效的手段。现通过例6-4来考察如

32、何使用命令行参数。例 6-4 UseComLParameter.java 1: public class UseComLParameter2: 3: public static void main ( String args )4: 5: int a1, a2, a3 ;6: if ( args.length 2 ),7: 8: System.out.println(运行本程序应该提供两个命令行参数);9: System.exit(0);10: 11: a1 = Integer.parseInt( args0 ) ;12: a2 = Integer.parseInt( args1 ) ;13:

33、 a3 = a1*a2 ;14: System.out.println(a1 + 与 + a2 + 相乘的积为: + a3 );15: 16:,例6-4的功能是从命令行利用命令行参数读入两个整数,再把它们相乘后输出。假设将上述程序保存为一个UseComLParameter.java文件,经编译后生成UseComL-Parameter.class文件,则执行这个程序的命令行应该是如下的格式:java UseComLParameter 52 -4这里,java是用来运行字节码的Java解释器, UseComLParameter是所运行的字节码文件名(即所执行的类名),52和-4分别是两个命令行参数

34、。可以看出,Java的命令行参数跟在命令行主类名的后面,参数之间用空格分隔。如果命令行参数本身就带有空格,则可以用双引号将整个参数括起以示区别,例如“a dog”就是一个完整的命令行参数。,Java Application程序中用来接受命令行参数的数据结构是main( )方法的参数args,这个参数是一个字符串数组,其中的每个元素都是一个字符串,这些字符串来自于用户与类名同时输入的命令行参数,每个字符串保存一个命令行参数供程序使用,用户输入了几个命令行参数,数组args就有几个元素。例6-4中,第6到8句利用数组args的域length来判断用户在执行当前程序时输入了几个命令行参数,如果用户输

35、入的命令行参数的数目不符合程序的要求,则输出提示信息并退出程序的运行。,第11句中,数组元素args0用来接受第一个命令行参数(不需要跳过类名),即命令行中类名之后的第一个参数,在上例中为“52”,第12句中,args1用来接受第二个命令行参数,即命令行中类名之后的第二个参数,在上例中为“-4”,以此类推。 另外需要注意的是,所有的命令行参数都是以字符串String类型的对象形式存在,如果希望把参数作为其他类型的数据使用,则还需要做相应的类型转换。例如上面的例子中第11和第12句调用了Integer类的静态方法parseInt来实现String到整型数int的转换,转换成其他数据类型的方法和思

36、路类似。程序运行的结果如图6.4所示。,图 6.4 例6-4的运行结果,可见,命令行参数是提供给整个程序的参数,每次运行时使用不同的命令行参数,就有不同的运行结果;使用命令行参数可以提高程序的灵活性和适应性。不过在使用命令行参数时要注意数组越界的问题,程序运行时系统将自动检查用户输入了多少个命令行参数并逐个地保存在数组args中,但是如果程序不检查用户到底输入了多少个命令行参数而直接访问args某下标的数组元素,则可能造成数组越界异常。例如:,public class TestSystemExceptionpublic static void main(String args)System.out.println(You have entered following parameters:);for(int i=0; i3; i+) /错误,应改为for(int i=0; iargs.length; i+)System.out.println(t + argsi); ,这个程序在使用命令行:c: java TestSystemException 1 2时,将产生数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报