Java第6章字符串及应用.ppt_第1页
Java第6章字符串及应用.ppt_第2页
Java第6章字符串及应用.ppt_第3页
Java第6章字符串及应用.ppt_第4页
Java第6章字符串及应用.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章字符串及应用,内容提要,字符串是字符的序列,它是许多程序设计语言的基本数据结构。有些语言中的字符串是通过字符数组实现的(如C语言),Java语言是通过字符串类实现的。,本章要点,本章主要介绍String类和StringBuilder类、命令行参数和正则表达式,字符串类,Java语言提供了三个字符串类:String类是不变字符串StringBuilder和StringBuffer是可变字符串这三种字符串都是16位的Unicode字符序列,并且这三个类都被声明为final,因此不能被继承。这三个类各有不同的特点,应用于不同场合。,6.1String类,6.1.1创建String类对象6.1.2字符串类几个常用方法6.1.3字符串查找6.1.4字符串与数组之间的转换6.1.5字符串的解析6.1.6字符串比较6.1.7String对象的不变性,6.1.1创建String类对象,方法一:直接利用字符串字面量创建字符串对象,例如:Strings=ThisisaJavastring.;方法二:一般使用String类的构造方法创建一个字符串对象。String类有十多个重载的构造方法,可以生成一个空字符串,也可以由字符或字节数组生成字符串。常用的构造方法如下:,6.1.1创建String类对象,publicString():创建一个空字符串。publicString(charvalue):使用字符数组中的字符创建字符串。publicString(charvalue,intoffset,intcount):使用字符数组中offset为起始下标,count个字符创建一个字符串。publicString(bytebytes):使用字节数组中的字符创建字符串。publicString(bytebytes,intoffset,intcount):offset为数组元素起始下标,count为元素个数。使用这些字节创建字符串。,6.1.1创建String类对象,publicString(bytebytes,StringcharsetName):使用指定的字节数组构造一个新的字符串,新字符串的长度与字符集有关,因此可能与字节数组的长度不同。charsetName为使用的字符集名,如US-ASCII、ISO-8859-1、UTF-8、UTF-16等。如果使用了系统不支持的字符集,将抛出UnsupportedEncodingException异常。publicString(Stringoriginal):使用一个字符串对象创建字符串。publicString(StringBufferbuffer):使用StringBuffer对象创建字符串。publicString(StringBuilderbuffer):使用StringBuilder对象创建字符串。,6.1.1创建String类对象,下面的例子说明了使用字符串的构造方法创建字符串对象。程序6.1StringDemo.java程序运行结果为:s1=ABCs2=中国s3=ABCs4=abcde,6.1.2字符串类几个常用方法,String类定义了许多方法,下面是几个最常用方法。publicintlength():返回字符串的长度,即字符串包含的字符个数。注意,对含有中文或其他语言符号的字符串,计算长度时,一个符号作为一个字符计数。publiccharcharAt(intindex):返回字符串中指定位置的字符,index表示位置,范围为0s.length()-1。publicStringconcat(Stringstr):将调用字符串与参数字符串连接起来,产生一个新的字符串。,6.1.2字符串类几个常用方法,publicStringsubstring(intbeginIndex,intendIndex):从字符串的下标beginIndex开始到endIndex结束产生一个子字符串。publicStringsubstring(intbeginIndex):从字符串的下标beginIndex开始到结束产生一个子字符串。publicStringreplace(charoldChar,charnewChar):将字符串中的所有oldChar字符改变为newChar字符,返回一个新的字符串。publicStringtoUpperCase():将字符串转换成大写字母。publicStringtoLowerCase():将字符串转换成小写字母。,6.1.2字符串类几个常用方法,publicStringtrim():返回去掉了前后空白字符的字符串对象。publicbooleanisEmpty():返回该字符串是否为空(),如果length()的结果为0,方法返回true,否则返回false。,6.1.2字符串类几个常用方法,下面程序要求从键盘输入一个字符串,判断该字符串是否是回文串。一个字符串,如果从前向后读和从后向前读都一样,则称该串为回文串。例如,“mom”和“上海海上”都是回文串。,算法思想:对于一个字符串,先判断该字符串的第一个字符和最后一个字符是否相等,如果相等,检查第二个字符和倒数第二个字符是否相等。这个过程一直进行,直到出现不相等的情况或者串中所有字符都检测完毕,当字符串有奇数个字符时,中间的字符不用检查。,6.1.2字符串类几个常用方法,程序6.2CheckPalindrome.java,6.1.3字符串查找,String类提供了从字符串中查找字符和子串的方法,如下所示。publicintindexOf(intch):查找字符ch第一次出现的位置。如果查找不成功则返回-1,下述方法相同。publicintindexOf(intch,intfromIndex):查找字符ch从fromIndex开始第一次出现的位置(在原字符串中的下标)。publicintlastIndexOf(intch):查找字符ch最后一次出现的位置。publicintlastIndexOf(intch,intendIndex):查找字符ch到endIndex为止最后一次出现的位置。,6.1.3字符串查找,publicintindexOf(Stringstr,intfromIndex):查找字符串str从fromIndex开始第一次出现的位置(在原字符串中的下标)。publicintindexOf(Stringstr):查找字符串str第一次出现的位置。publicintlastIndexOf(Stringstr):查找字符串str最后一次出现的位置publicintlastIndexOf(Stringstr,intendIndex):查找字符串str到endIndex为止最后一次出现的位置(在原字符串中的下标)。,6.1.3字符串查找,程序6.3StringSearch.java,6.1.4字符串与数组之间的转换,字符串不是数组,但是字符串能够转换成数组,反之亦然。String类提供了下列方法将字符串转换成数组:publicchartoCharArray():将字符串中的字符转换为字符数组。publicbytegetBytes():使用平台默认的字符集将字符串编码成字节序列并将结果存储到字节数组中。,6.1.4字符串与数组之间的转换,publicbytegetBytes(StringcharsetName):使用指定的字符集将字符串编码成字节序列并将结果存储到字节数组中。该方法抛出java.io.UnsupportedEncodingException异常。publicvoidgetChars(intsrcBegin,intsrcEnd,chardst,intdstBegin):将字符串中从起始位置(srcBegin)到结束位置(srcEnd)之间的字符复制到字符数组dst中,dstBegin为目标数组的起始位置。,6.1.4字符串与数组之间的转换,下面代码使用toCharArray()方法将字符串转换为字符数组,使用getChars()方法将字符串的一部分复制到字符数组中。Strings=newString(ThisisaJavastring.);charchars=s.toCharArray();System.out.println(chars);/ThisisaJavastring.charsubs=newchar4;s.getChars(10,14,subs,0);System.out.println(subs);/Java,6.1.5字符串的解析,String类提供了一个split()方法,它实现将一个字符串分解成子字符串或令牌(Token)。该方法使用正则表达式指定分隔符,该方法有下面两种格式:publicStringsplit(Stringregex,intn)参数regex表示正则表达式,n表示模式应用的次数。如果n的值为0,则模式将应用尽可能多的次数,末尾的空字符串被丢弃。如果n的值大于0,则模式至多被应用n-1次,结果数组的长度不大于n,数组的最后一项将包含除最后一个匹配的分隔符外的所有输入内容。如果n的值小于0,则模式将应用尽可能多的次数。,6.1.5字符串的解析,publicStringsplit(Stringregex):与上述方法n为0的情况相同。publicbooleanmatches(Stringregex):返回字符串是否与给定的正则表达式匹配。在split()方法中指定的正则表达式“,.”的含义是使用空格、逗号或句点为分隔符解析字符串。关于正则表达式请参考6.4节。,6.1.5字符串的解析,程序6.4SplitDemo.javapublicclassSplitDemopublicstaticvoidmain(Stringargs)Stringss=onelittle,twolittle,threelittle.;Stringstr=ss.split(,.);for(Strings:str)System.out.println(s);System.out.println(ss.matches(.*little.*);/输出true,6.1.6字符串比较,在Java程序中,经常需要比较两个字符串是否相等、或比较两个字符串的大小,下面介绍如何比较字符串。1.字符串相等的比较要比较两个字符串是否相等,你可能想到用“=”号来比较,如下代码所示:Strings1=newString(Hello);Strings2=newString(Hello);System.out.println(s1=s2);然而,上面代码的输出结果为false。这是因为在Java语言中用“=”比较引用类型的数据(对象)时,比较的是引用(地址)是否相等。,6.1.6字符串比较,只有两个引用指向同一个对象时,结果才为true。上面使用构造方法创建的两个对象是不同的,因此s1和s2的引用是不同的,如图6.1(a)所示。,6.1.6字符串比较,再看下面一段代码:Strings1=Hello;Strings2=Hello;System.out.println(s1=s2);这次输出结果为true。这两段代码的不同之处就在于创建s1、s2对象的代码不同。这里的s1、s2是用字符串常量创建的两个对象。字符串常量存储和对象存储不同,字符串常量是存储在常量池中,对内容相同的字符串常量在常量池中只有一个副本,因此s1和s2是指向同一个对象,如图6.1(b)所示。,6.1.6字符串比较,由上面可以看到,“=”用来比较两个引用值是否相等,如果要比较两个对象的内容是否相等,可以使用String类的equals()方法或equalsIgnoreCase()方法。publicbooleanequals(StringanotherString)publicbooleanequalsIgnoreCase(StringanotherString)使用第二个方法比较时将忽略大小写。对于上面两种情况,表达式:s1.equals(s2)的结果都为true,因为s1、s2的内容相等。,6.1.6字符串比较,2.字符串大小的比较使用equals()方法只能比较字符串的相等与否,要比较大小,可以使用String类的compareTo()方法或compareToIgnoreCase()方法,格式为:publicintcompareTo(StringanotherString)publicintcompareToIgnoreCase(StringanotherString),第二个方法比较时忽略大小写。该方法将当前字符串与参数字符串比较,并返回一个整数值。,6.1.6字符串比较,字符串比较使用字符的Unicode码值进行比较。若当前字符串小于参数字符串,方法返回值小于0,若当前字符串大于参数字符串,方法返回值大于0,若当前字符串等于参数字符串,方法返回值等于0。例如,表达式“ABC.compareTo(ABD)的返回值为-1。注意:字符串不能使用、=、javaHelloProgramHoware上述命令中只提供了两个命令行参数,创建的args数组长度为2,而程序中访问了第3个元素(args2),故产生运行时异常。,6.2命令行参数,命令行参数传递的是字符串,若将其作为数值处理,需要进行转换。下面的程序要求从命令行输入3个整数,输出最大值和最小值。程序6.8ThreeInteger.javapublicclassThreeIntegerpublicstaticvoidmain(Stringargs)intmax,min,a,b,c;a=Integer.parseInt(args0);/将字符串转换为整数b=Integer.parseInt(args1);,6.2命令行参数,c=Integer.parseInt(args2);max=Math.max(Math.max(a,b),c);/求a,b,c的最大值min=Math.min(Math.min(a,b),c);System.out.println(max=+max);System.out.println(min=+min);运行该程序需要在命令行给出参数,如下所示:D:studyjavaThreeInteger23-234100程序运行结果为:max=100min=-234,6.3StringBuilder类,StringBuilder和StringBuffer类都表示可变字符串,即这两个类的对象内容是可以修改的。6.3.1创建StringBuilder对象6.3.2StringBuilder的访问和修改6.3.3运算符“+”的重载,6.3.1创建StringBuilder对象,StringBuilder类是Java5新增加的,它表示可变字符串。StringBuilder类常用的构造方法有下面3个。publicStringBuilder():创建一个没有字符的字符串缓冲区,初始容量为16个字符。此时length()方法的值为0,而capacity()方法的值为16。,6.3.1创建StringBuilder对象,publicStringBuilder(intcapacity):创建一个没有字符的字符串缓冲区,capacity为指定的初始容量。publicStringBuilder(Stringstr):利用一个已存在的字符串对象str创建一个字符串缓冲区对象,另外再分配16个字符的缓冲区。,StringBuilder类除定义了length()、charAt()、indexOf()、getChars()等方法外,还提供了下列常用方法:publicintcapacity():返回当前的字符串缓冲区的总容量。publicvoidsetCharAt(intindex,charch):用ch修改指定位置的字符。publicStringBuilderdeleteCharAt(intindex):删除指定位置的字符。publicStringBuilderappend(Stringstr)在当前的字符串的末尾添加一个字符串。,6.3.2StringBuilder的访问和修改,6.3.2StringBuilder的访问和修改,append方法有一系列的重载方法,参数可以是boolean、char、int、long、float、double、char等任何数据类型。publicStringBuilderinsert(intoffset,Stringstr):在当前字符串的指定位置插入一个字符串。这个方法个也有多个重载的方法,参数可以是boolean、char、int、long、float、double、char等类型。publicStringBuilderdelete(intstart,intend):删除从start开始到end(不包括end)之间的字符。publicStringBuilderreplace(intstart,intend,Stringstr):用字符串str替换从start开始到end(不包括end)之间的字符。,6.3.2StringBuilder的访问和修改,publicStringBuilderreverse():将字符串的所有字符反转。publicStringsubstring(intstart):返回从start开始到字符串末尾的子字符串。publicStringsubstring(intstart,intend):返回从start开始到end(不包括end)之间的子字符串。publicvoidsetLength(intnewLength):设置字符序列的长度。如果newLength小于原字符串的长度,字符串将被截短,如果newLength大于原字符串的长度,字符串将使用空字符(u0000)扩充。,6.3.2StringBuilder的访问和修改,程序6.9StringBuilderDemo.java该程序演示了StringBuilder对象及其方法的使用。publicclassStringBuilderDemopublicstaticvoidmain(Stringargs)StringBuilderss=newStringBuilder(Hello);System.out.println(ss.length();System.out.println(ss.capacity();ss.append(Java);System.out.println(ss);System.out.println(ss.insert(5,);System.out.println(ss.replace(6,10,World!);System.out.println(ss.reverse();,6.3.2StringBuilder的访问和修改,程序运行结果为:521HelloJavaHello,JavaHello,World!dlroW,olleH,使用StringBuilder对象可以方便地对其修改,而不需要生成新的对象。,6.3.3运算符“+”的重载,在Java语言中不支持运算符重载,但有一个特例,即“+”运算符(包括+=),它是唯一重载的运算符。该运算符除用于计算两个数之和外还用于连接两个字符串。当用“+”运算符连接的两个操作数其中有一个是String类型时,该运算即为字符串连接运算,如:intage=18;Strings=Heis+age+yearsold.;上述连接运算过程实际上是这样进行的:Strings=newStringBuilder(Heis).append(age).append(yearsold.).toString();,6.3.3运算符“+”的重载,提示:Java还定义了StringBuffer类,它与StringBuilder类的主要区别是StringBuffer类的实例是线程安全的,而StringBuilder类的实例不是线程安全的。如果不需要线程同步,建议使用StringBuilder类。,6.4正则表达式,模式匹配在计算机中有着广泛的应用。Java语言通过Pattern和Matcher类也提供了强大的模式匹配的功能。6.4.1模式匹配6.4.2Pattern类6.4.3Matcher类6.4.4量词和捕获组,6.4.1模式匹配,1.什么是模式匹配看一个简单的例子。假如有一个字符串“a22apple45ab”,若要在该字符串中查找“apple”。可以找到一个匹配。我们应该指定一个模式串“.*apple.*”,字符串“a22apple45ab”称为输入串。,6.4.1模式匹配,为了实现复杂的模式匹配,模式串的构造应该遵循某种规则,这样的模式称为正则表达式(regularexpressions)。在Java语言中通过java.util.regex包中的类实现正则表达式的模式匹配。该包中提供了Pattern、Matcher和PatternSyntaxException类与MatchResult接口。Pattern对象就是一个正则表达式的编译表示形式。Pattern类没有定义构造方法,要得到该类对象,需要调用该类的静态方法compile()。该方法接受一个字符串参数,该字符串必须是一个正则表达式,该方法返回Pattern对象。,6.4.1模式匹配,Matcher类的实例用来按照给定的模式匹配一个输入字符序列。Matcher类也没有定义public的构造方法,需要调用Pattern类的实例方法matcher()返回Matcher类的一个实例,该方法接受一个字符序列,它就是模式要与其匹配的输入串。接下来,调用Matcher类的实例方法matches()来判断是否有一个匹配。,6.4.1模式匹配,面是一个典型的调用顺序:Patternp=Ppile(.*apple.*);Matcherm=p.matcher(a22apple45ab);booleanb=m.matches();/b的结果为true,说明有一个匹配,6.4.1模式匹配,当正则表达式只使用一次时,使用Pattern类中定义的matches()方法更方便,该方法同时编译模式并与输入字符串匹配,语句如下:booleanb=Pattern.matches(.*apple.*,a22apple45ab);Pattern类的实例是不可变的对象并且在被多个线程使用时是安全的,而Matcher实例不是安全的。,6.4.1模式匹配,模式的指定最简单的模式可以只包含一个字符。要指定多个字符或字符范围,需要使用方括号将字符括起来。例如,jaz匹配j、a、z,而j-z匹配j到z的字符,也可以使用否定符号,如abc表示匹配除a、b、c以外的字符。表6.1列出了一些示例。,6.4.1模式匹配,表6.1正则表达式示例,6.4.1模式匹配,在模式串中还可以使用一些预定义字符,称为元字符,如表6.2所示。表6.2常用的元字符,6.4.1模式匹配,下面的程序用来测试对于一个给定的正则表达式,是否能在输入串中找到匹配,以及匹配的开始和结束索引。程序6.10RegexTest.java,6.4.1模式匹配,运行该程序,然后输入字符串“2nabsjdkabc”,正则表达式输入“ab”,程序的运行结果为:Enterinputstring:2nabsjdkabcEnteryourregex:abIfoundthetextabstartingatindex2andendingatindex4.Ifoundthetextabstartingatindex8andendingatindex10.上述结果表示,在“2nabsjdkabc”找到了两个“ab”,第一个开始位置为0,结束位置为4,第二个开始位置为8,结束位置为10,。这里位置是从0开始的。,6.4.2Pattern类,Pattern类的实例是用字符串的形式表示的正则表达式,语法类似于Perl语言的语法。使用Pattern类的静态方法compile()方法构造模式对象,该方法有两种形式:publicstaticPatterncompile(Stringregex):将给定的正则表达式编译成Pattern类的一个实例,如果表达式语法错误,将抛出PatternSyntaxException运行时异常。publicstaticPatterncompile(Stringregex,intflags):flags参数用来指定匹配如何进行,它使用Pattern类的一个常量。例如,CASE_INSENSITIVE表示启用不区分大小写的匹配,其他常量请参阅API文档。,6.4.2Pattern类,Pattern类的其他常用方法有:publicStringpattern():返回该模式对象的正则表达式字符串。publicMatchermatcher(CharSequenceinput):创建按照模式与给定的输入字符序列匹配的Matcher对象。publicstaticbooleanmatches(Stringregex,CharSequenceinput):对给定的正则表达式编译并与输入序列匹配,如果匹配成功返回true。当不需要重复使用匹配器时可以使用该方法,6.4.2Pattern类,publicStringsplit(CharSequenceinput):使用该模式对象对输入字符序列拆分。publicStringsplit(CharSequenceinput,intlimit):limit参数用于控制模式使用的次数,它将影响结果数组的长度。publicintflags():返回该模式的匹配标志。publicstaticStringquote(Strings):返回一个String对象,它可用来创建与s匹配的模式。publicStringtoString():返回该模式对象的字符串表示。,6.4.2Pattern类,下面程序使用逗号和空格创建一个模式,然后用其拆分一个字符串。程序6.11Splitter.javaimportjava.util.regex.*;publicclassSplitterpublicstaticvoidmain(Stringargs)throwsException/创建一个模式对象Patternp=Ppile(,s+);/使用模式对象对输入字符串分解Stringresult=p.split(one,two,threefour,five);for(inti=0;iresult.length;i+)System.out.print(|+resulti+|,);,程序运行结果为:|one|,|two|,|three|,|four|,|five|,6.4.3Matcher类,Matcher类的实例用来根据给定的模式匹配字符序列。通过调用模式对象的matcher()方法来得到一个Matcher类的对象。一旦得到一个Matcher类的对象,就可以使用下列方法执行匹配操作,这些方法返回值为boolean类型。,6.4.3Matcher类,publicbooleanmatches():尝试将整个输入序列与该模式进行匹配。如果返回true,则匹配成功,匹配成功后可以使用start()方法、end()方法和group()方法获得更多信息。publicbooleanlookingAt():尝试从区域开始处的输入序列与该模式进行匹配。与matches()方法不同的是它不需要匹配整个输入序列。publicbooleanfind():尝试查找输入序列中与该模式匹配的下一个序列。该方法从序列的开头开始匹配,或者,如果上一次find()方法是成功的,并且匹配器没有重置,则本次匹配从上次匹配中还没进行匹配的第一个字符开始,6.4.3Matcher类,publicbooleanfind(intstart):重置该匹配器,然后尝试从指定索引位置开始查找与该模式匹配的下一个子序列。如果查找成功,则可以使用下列方法返回有关匹配的更多信息。publicintstart():返回上次成功匹配的开始索引值。publicintend():返回匹配的序列中最后一个字符的索引值加1的值。publicStringgroup():返回匹配成功的子序列,即由start和end定义的子字符串。publicintgroupCount():返回该匹配器模式中的捕获组数。组号范围从0开始,到这个组数减1的值。,6.4.3Matcher类,publicStringgroup(intgroup):返回上次匹配中与给定组匹配的输入子序列。第0组表示整个匹配模式,所以group(0)与group()等价。publicintstart(intgroup):返回上次匹配中给定组的开始索引值。publicintend(intgroup):返回与给定组匹配的序列中最后一个字符的索引值加1。一旦开始进行匹配,可以使用下列方法改变匹配器的状态:publicMatcherreset():重置匹配器。该方法将丢弃该匹配器的所有状态信息,并将其追加位置重置为0。该方法返回的Matcher对象就是调用该方法的Matcher对象。,6.4.3Matcher类,publicMatcherreset(CharSequenceinput):将该匹配器重置为使用新的输入序列。publicMatcherusePattern(Patternpattern):将该匹配器使用的模式重新设置为传递来的模式pattern。Matcher类也定义了使用新字符串替换匹配的序列的方法,如下所示:publicStringreplaceFirst(Stringreplacement):将与该匹配器的模式匹配的第一个字符序列替换成replacement字符串,并返回结果。该方法将首先重置匹配器,操作完成后不重置匹配器。,6.4.3Matcher类,publicStringreplaceAll(Stringreplacement):将所有与该匹配器的模式匹配的字符序列都替换成replacement字符串,并返回结果。该方法将首先重置匹配器,操作完成后不重置匹配器。publicMatcherappendReplacement(StringBufferbuf,Stringreplacement):首先将当前追加位置和匹配位置之间的字符添加到字符串缓冲区中,接着添加replacement字符串,最后将匹配器的追加位置改为匹配字符序列之后的位置。publicStringBufferappendTail(StringBufferbuf):将从当前追加位置开始直到字符序列结尾为止的所有字符添加到字符串缓冲区中,最后返回该缓冲区对象。,6.4.3Matcher类,程序6.12Replacement.javaimportjava.util.regex.*;publicclassReplacementpublicstaticvoidmain(Stringargs)throwsException/创建一个匹配cat的模式对象Patternp=Ppile(cat);/使用输入字符串创建一个匹配器对象Matcherm=p.matcher

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论