第6章字符串操作本章目的:字符和字符串是Java语言中重要的数据结构类型。本章重点讲述Java中的几个主要的跟字符相关数据结构类型:字符、字符串(String类)、字符串缓冲类(StringBuffer类)、字符串分解类(StringTokenizer类)和正则表达式(RegularExpressions)。深入了解这些Java中已经提供的强大字符串数据结构可以使编写文本处理程序更加简单迅速。教学重点与难点:◆字符串的定义和使用◆字符串缓冲区的使用◆字符串分解类的使用,对复杂文本进行分解◆正则表达式的使用6.1字符和字符串字符是一种通用数据类型,用单引号括起来的一个字符,如'a'、'A'。在本书前面已经介绍过了字符,跟字符密切相关的通用数据类型是字符串。字符串常量是用双引号括起来的一串字符,比如HelloWorld!\n。在Java中,字符串常量是作为String类(String类将在6.2节中介绍)的一个特定的对象来处理的,而不是一个数据。6.2String类在Java中,字符串变量的类型为String,而字符串常量也是作为String类的特殊对象进行处理的。6.2.1String类的构造函数在昀通常的情况下,一个字符串是从一个string语句来产生的:Stringgreeting=Hello;或者:Stringgreeting=newString(Hello);用Hello构造出greeting这个String类的对象。或者通过使用一个字符数组的构造语句来产生的:char[]bunch={'H','e','l','l','o'};Stringgreeting=newString(bunch);用bunch这个字符数组的内容来构造字符串greeting。String类的构造函数还有其他的形式:6.2.2字符串比较比较两个字符串内容是否一样可以使用String类中提供的equals和equalsIgnoreCase两个方法。而equals测试两个字符串是否含有相同的字符,equalsIgnoreCase则是忽略字符串中的大小写(Case)比较两个字符串的。如果结果一致,这两个方法返回true,内容不同,则返回值为false。需要注意的地方是在Java早期的版本中==运算符只能用来测试两个字符串是否是相同的字符串实例,而在新的JDK中,==运算符和equals的效果是一样的。如果要比较两个字符串的大小关系,即它们按字母序排列的时候谁将排在前面,String类提供了一个compareTo的方法,它的函数原型是:publicintcompareTo(Stringstr);它的返回值为一个整型的值,如果返回值为-1,则该字符串位于字符串str的前面,返回值为0,该字符串与str内容一致;返回值为1,该字符串在str后面。下例说明这几个方法的使用://~CompareString.javapublicclassCompareString{publicCompareString(){}publicstaticvoidmain(String[]args){StringstrA=AppleTree;StringstrB=appleTREE;StringstrC=AppleTree;if(strA==strB){System.out.println(strA+&+strB+arethesame.);}else{System.out.println(strA+&+strB+arenotthesame.);}if(strA==strC){System.out.println(strA+&+strC+arethesame.);}else{System.out.println(strA+&+strC+arenotthesame.);}if(strA.equals(strB)){System.out.println(strA+isequalsto+strB);}else{System.out.println(strA+isnotequalsto+strB);}if(strA.equals(strC)){System.out.println(strA+isequalsto+strC);}else{System.out.println(strA+isnotequalsto+strC);}if(strA.equalsIgnoreCase(strB)){System.out.println(strA+&+strB+arethesame(nocase).);}else{System.out.println(strA+&+strB+arenotthesame(nocase).);}}}输出结果是:AppleTree&appleTREEarenotthesame.AppleTree&AppleTreearethesame.AppleTreeisnotequalstoappleTREEAppleTreeisequalstoAppleTreeAppleTree&appleTREEarethesame(nocase).6.2.3hashCode()方法String类提供一个hashCode()的方法,返回int类型的哈希值,其计算公式如下:hashcode=s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]公式中的s[i]是字符串中的第i个字符,n是字符串的长度,^是幂运算符号。空字符串的哈希值是0。例://~TestHashCode.javapublicclassTestHashCode{publicTestHashCode(){}publicstaticvoidmain(String[]args){Stringstr=abc;intcode=str.hashCode();System.out.println(theString+str+hashcodeis+code);}}输出结果是:theStringabchashcodeis963546.2.4定位字符和子串要查找某个字符或者子字符串在一个字符串中的位置,Java提供的方法是indexOf,这个方法有几种重载形式。publicintindexOf(intch);查找字符串中第一个Unicode为ch的字符的位置,并返回。如果查找失败,返回-1;publicintindexOf(intch,intfromIndex);从fromIndex开始查找到字符串中第一个Unicode为ch的字符的位置,并返回。如果查找失败,返回-1;publicintlastIndexOf(intch);查找字符串中昀后一个Unicode为ch的字符的位置,并返回。如果查找失败,返回-1;publicintlastIndexOf(intch,intfromIndex);从fromIndex开始,查找昀后一个Unicode为ch的字符的位置,并返回。如果查找失败,返回-1。publicintindexOf(Stringstr);查找字符串中的一个子串为str的位置,并返回。如果查找失败,返回-1;publicintindexOf(Stringstr,intfromIndex);从fromIndex开始查找到字符串中的一个子串为str的位置,并返回,如果查找失败,返回-1;publicintlastIndexOf(Stringstr);查找字符串中昀后一个子串为str的位置,并返回,如果查找失败,返回-1;publicintlastIndexOf(Stringstr,intfromIndex);从fromIndex开始,查找昀后一个子串为str的位置,并返回,如果查找失败,返回-1;用一个例子说明这些定位方法的使用://~TestIndex.javapublicclassTestIndex{publicTestIndex(){}publicstaticvoidmain(String[]args){Strings=ssabcdefgabcklabcstabcxyz;Stringsubs=abc;System.out.println(thefirst'a'isat+s.indexOf('a'));System.out.println(thelast'a'isat+s.lastIndexOf('a'));System.out.println(thefirst'a'after10isat+s.indexOf('a',10));System.out.println(thelast'a'before10isat+s.lastIndexOf('a',10));System.out.println(thefirstabcisat+s.indexOf(subs));System.out.println(thelastabcisat+s.lastIndexOf(subs));System.out.println(thefirstabcafter10isat+s.indexOf(subs,10));System.out.println(thelastabcbefore10isat+s.lastIndexOf(subs,10));}}程序中用于查找的字符串为ssabcdefgabcklabcstabcxyz,分别按不同的条件查找‘a’和abc的位置。运行结果:thefirst'a'isat2thelast'a'isat19thefirst'a'after10isat14thelast'a'before10isat9thefirstabcisat2thelastabcisat19thefirstabcafter10isat14thelastabcbefore10isat96.2.5抽取子串String类中提供了抽取子字符串的方法substring,它有以下几种形式:publicStringsubstring(intbeginIndex);返回从beginIndex到字符串结束的子串。这里beginIndex的取值范围应该在区间[0,n]内,如果越界,返回值为空字符串。publicStringsubstring(intbeginIndex,intendIndex);返回beginIndex与endIndex之间的子串。这里beginIndex和endIndex取值范围也应该在区间[0,n]内,且beginIndex=endIndex,如果不满足,返回值为空字符串。程序示例://~TestSubstring.javapublicclassTestSubstring{publicTestSubstring(){}publicstaticvoidmain(String[]args){Stringstr=Thisisanapple;System.out.println(thesubstringafter11is+str.substring(11));System.out.println(thesubstringbetween8&10is+str.substring(8,10));}}运行结果:thesubstringafter11isapplethesubstringbetween8&10isan6.2.6字符串修改非常遗憾的是,由于String类不提供修改自身的方法,因此,String从初始化之后就不能再改变其内容了,如果要使用String类的方法对改变一个字符串的内容,必须另外生成一个新的字符串,或者,更方便的方法是使用StringBuffer类来保存字符串的内容而不是String类。StringBuffer类的用法在6.3节会有详细叙述。6.2.7String类的其他方法publicintlength();返回值为字符串的长度。publiccharcharAt(inti);返回字符串中的第i个字符。publicStringreplace(charoldChar,charnewChar)字符替代的方法,把字符串中的oldChar用n