第3章字符串_第1页
第3章字符串_第2页
第3章字符串_第3页
第3章字符串_第4页
第3章字符串_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 字 符 串字符串是编程中经常需要使用到的数据结构,是字符的有序序列,如“JAVA”。在Java中,字符串是内部的标准对象,用一对双引号括起的字符序列就是一个字符串对象,使用运算符“+”及“+=”则可以用来结合字符串对象以建立新的结合字符串对象。在程序中需要使用到的字符串大致可以分为两大类,一类是创建之后不需要做修改和变动的字符串常量,另一类则是创建之后需要添加、插入和修改等更改操作的字符串变量。在Java中,对于字符串常量对象使用String类,它提供了许多诸如比较(compareTo)、查找(indexOf)之类的操作,而对于字符串变量对象则使用StringBuffer类,它提供了扩

2、充(append)、插入(insert)等操作,这些操作将在本章中进行讲述。3.1 String类和字符串常量字符串常量其实在前面的程序中已经多次出现,大家一定不会陌生,比如“Hello Java”等。但是在这里需要强调一下字符串常量和字符常量的区别,字符常量是用单引号括起来的单个字符,比如x,n等,而字符串常量则是用双引号括起来的字符序列,如“x”,“n”,“Java”等。此外Java的字符串常量和字符数组也有很大的区别,不再像C语言那样使用字符数组来表示字符串,而是使用String类来存放字符串常量,有专门的属性和方法等,关于这一点在后面的第4小节有详细的叙述。3.1.1 String类的

3、构造函数对于String类以及后面讲到的StringBuffer类都存在于java.lang包中,它们之间的最大区别是String类建立的对象是只读的(read only),一旦建立就不能更改,但是可以进行比较、查找、连接等操作,下面就详细介绍String对象的构造函数及它的方法。表3-1 String类的构造函数名 称说 明String()创建一个空的String对象String(String original)通过给定的字符串常量original创建一个新的String对象String(char value)通过给定的字符数组value,创建一个新的String对象St

4、ring(char value, int offset, int count)在字符数组value中,截取以offset为开始,count个的字符序列来创建新的String对象String(StringBuffer buffer)利用已经存在的StringBuffer类对象buffer,创建一个新的String对象String(byte bytes)使用操作系统默认的字符集对给定的字节数组bytes参数进行解码后,创建一个新的String对象tring(byte bytes, int offset, int len

5、gth)与String(byte bytes)的区别在于只截取以offset为开始,count个的字节序列创建String对象String(byte ascii, int hibyte)创建一个新的String对象,其中包含字节数组ascii中的所有元素,字符的所有高位字节均设定为hibyteString(byte ascii,int hibyte,int offset,int count)与String(byte ascii, int hibyte)不同的是该构造函数指定了起始位置和截取的元素个数了解了Strin

6、g类的构造函数后,下面来看几个创建String对象的例子。1String(String original)该构造函数利用一个已经存在的字符串常量original创建一个新的String对象。对于original而言,它可以是另一个String对象,也可以是一个双引号括起来的直接字符串常量,新的String对象内容和original一样,就像是original的一个备份。例3.1 用String(String original)创建String对象的示例程序StringTest1.javapublic class StringTest1public static void m

7、ain(String arg)String s="I love java!" /创建一个新的String对象,等价 /于String s=new String("I love java!") System.out.println(s); /输出s的内容到屏幕上 String s1=new String(s); /创建一个与s相同的String对象s1 System.out.println(s1); /输出s1的内容到屏幕上 程序的运行结果如图3-1所示。图3-1 例3.1的运行结果2String(char value)该构造函数利用一个已经存在

8、的字符数组value创建一个新的String对象,而后面程序对字符数组value的改变将不会影响这个新创建的String对象的内容。和String(char value, int offset, int count)相比,后者更加灵活,但需要注意的是offset是从0开始的,其他类似的构造函数也是如此。例3.2 用String(char value)来创建String对象的示例程序StringTest2.javapublic class StringTest2public static void main(String arg)char a='I

9、',' ','l','o','v','e',' ','j','a','v','a','!' /定义字符数组aString s=new String(a); /创建新的String对象sSystem.out.println(s); /输出s的内容到屏幕上String s1=new String(a,7,4); /从字符数组a的第8个字符起截 /取4个用以创建新的String对象s1 System.out.print

10、ln(s1); /输出s1的内容到屏幕上 程序的运行结果如图3-2所示。图3-2 例3.2的运行结果3String(byte bytes)该构造函数使用操作系统默认的字符集对给定的字节数组参数bytes进行解码,新创建的String对象包含所有解码后的字符序列,但该对象的字符长度可能与字节数组原来的长度不一样。后面程序对字节数组bytes的更改将不会影响新创建的String对象。例3.3 用String(byte bytes)创建String对象的示例程序StringTest3.javapublic class StringTest3public static void m

11、ain(String arg) byte a =73,32,108,111,118,101,32,106,97,118,97,33; /定义字节数组a String s=new String(a); /创建String对象s System.out.println(s); /输出s的内容到屏幕上 程序的运行结果如图3-3所示。图3-3 例3.3的运行结果3.1.2 String类的方法String是一个常用的类,它常用的方法有很多,在这个部分将介绍String类中的方法和使用。表3-2 String类的方法分类返回类型方 法说 明长度intlength()返回字符串的长度。需要注意的是在java

12、中,每个字符都是占用16bit的Unicode字符判断前缀后缀booleanstartsWith(String prefix) 如果本字符串的前缀是指定的字符串prefix,则返回true,否则返回falsebooleanstartsWith(String prefix,int toffset)    如果本字符串从toffset开始的前缀是指定的字符串prefix,则返回true,否则返回false。booleanendsWith(String suffix) 如果当前String对象的字符串后缀是指定的Stri

13、ng对象suffix,则返回true,否则返回false查找intindexOf(int ch) 返回该String对象内容中第一次出现ch字符的位置,找不到返回1intindexOf(int ch, int fromIndex) 返回该String对象内容中从fromIndex开始,第一次出现ch字符的位置,找不到返回1intindexOf(String str) 返回该String对象内容中第一次出现str内容的位置,找不到返回1intindexOf(String str, int fromIndex) 返回该String对象内容

14、中从fromIndex开始,第一次出现str内容的位置,找不到返回1intlastIndexOf(int ch) 返回该String对象内容中从尾部开始向前查找第一次出现ch字符的位置,找不到返回1intlastIndexOf(int ch, int fromIndex) 返回该String对象内容中从fromIndex算起尾部开始向前查找第一次出现ch字符的位置,找不到返回1intlastIndexOf(String str) 返回该String对象内容中从尾部开始向前查找第一次出现str内容的位置,找不到返回1(续)分类返回类型方 法说 明查找int

15、lastIndexOf(String str, int fromIndex) 返回该String对象内容中从fromIndex算起从尾部向前查找第一次出现str内容的位置,找不到返回1比较intcompareTo(Object o) 将原String对象与给定的对象o进行比较。如果等于则返回0,大于则返回大于0的整数,小于则返回小于0的整数intcompareTo(String anotherString) 将原String对象与给定的另一个String对象anotherString进行比较。如果等于则返回0,大于则返回大于0的整数,小于则返回小于0的整

16、数intcompareToIgnoreCase(Stringstr) 将原String对象与给定的另一个String对象str进行比较,不考虑字母的大小写。如果等于则返回0,大于则返回大于0的整数,小于则返回小于0的整数booleanequals(Object anObject)   如果当前String对象与对象anObject对象内容相等,则返回true,否则返回falsebooleanequalsIgnoreCase(String anotherString) 在忽视字母大小写的情况下,如果当前String对象与另一个String对象another

17、String内容相等,则返回true,否则返回false转换bytegetBytes() 将当前String对象的内容按照默认的字符集编码成字节数组StringtoLowerCase() 返回原字符串所有字符转换为小写字符后的新字符串StringtoUpperCase() 返回原字符串所有字符转换为大写字符后的新字符串chartoCharArray() 将原字符串转换成字符数组Static StringcopyValueOf(char data) 将字符数组data转换成String对象Static StringcopyValueOf(char data, int 

18、;offset, int count) 将字符数组data中从第offset个开始,count个字符转换成String对象Static StringvalueOf(boolean b) 若b为true,则返回字符串“true”;若b为false,则返回字符串“false”Static StringvalueOf(char c) 返回字符c转换后的新字符串Static StringvalueOf(char data) 返回字符数组转换后的新字符串Static StringvalueOf(char data,int offset, int

19、 count) 返回字符数组data从offset开始,共count个元素转换后的新字符串Static StringvalueOf(double d) 返回双精度浮点数d转换后的新字符串Static StringvalueOf(float f) 返回浮点数f转换后的新字符串Static StringvalueOf(int i) 返回整数i转换后的新字符串Static StringvalueOf(long l)返回长整型数l转换后的新字符串Static StringvalueOf(Object obj) 返回对象obj转换后的新字符串替

20、换Stringreplace(char oldChar, char newChar) 返回将本字符串中所有oldChar字符改成newChar字符后的新字符串分割Stringsplit(String regex) 以符合正则表达式的字符串为分隔符,分割原字符串成字符串数组Stringsplit(String regex, int limit) 以符合正则表达式的字符串为分隔符,分割原字符串成字符串数组。limit决定字符串数组的上限提取Stringintern() 返回一个与原String对象内容相同的String对象,这两个对象在存储器中占有

21、同一个地址Stringsubstring(int beginIndex)返回本字符串从beginIndex字符开始至结束的子字符串。Stringsubstring(int beginIndex, int endIndex) 返回本字符串从beginIndex字符开始至endIndex字符(不含)的子字符串charcharAt(int index) 返回该字符串中从左算起的第index个字符(从0开始)Stringtrim() 返回原字符串去除前后空白字符后的新字符串连接Stringconcat(String str) 将原String

22、对象与给定的另一个String对象str进行连接,创建并返回一个新的String对象,但是原String对象和对象str的内容并不改变从上面对String类的构造函数和方法的说明可以看出,String类有着众多的构造函数和方法,使对String类的操作变得十分的灵活和实用,下面将用实例来进一步对它们进行说明。例3.4 String类方法的应用示例程序StringTest4.javaimport java.lang.*;import java.io.*;public class StringTest4public static void main(String arg)InputStreamRe

23、ader d=new InputStreamReader(System.in); char in_char=new char1024;/假设输入的字符串长度不大于1024short count=new short65536; /保存输入的字符分布情况int i,j=0; String s=null;char Max=0; /保存最大的字符System.out.print("请输入一个字符串:");System.out.flush();try j=d.read(in_char,0,1024); /in_char保存为输入的字符串 catch(IOException e); s

24、=String.valueOf(in_char,0,j-2); /将字符数组转换为字符串 s.trim(); /去除前后空格 if (s.length()=0 | pareTo("")=0) /检查是否为空字符串 System.out.println(""); System.out.println("这个一个空字符串"); System.exit(1);for (i=0;i<65536;i+) counti=0; /先将count初始化为0 for(=0;i<s.length();i+) counts.charAt(i)+

25、; /若重复出现就加1 for(i=0;i<65536;i+) if (counti>0) System.out.println(char)i+" 出现 "+counti+" 次!"); /输出统计情况 Max=(char)i; System.out.println("最大字符'"+Max+"'第一次出现在 "+(s.indexOf(Max)+1)+ " 最后一次出现在 "+(s.lastIndexOf(Max)+1); if (pareTo("java&q

26、uot;)=0)/比较 System.out.println("您输入了java!"); else if (pareTo("java")<0) System.out.println("您输入的字符串比java小!"); else if (pareTo("java")>0) System.out.println("您输入的字符串比java大!"); /替换 System.out.println("替换后的字符串为:"+s.replaceAll("java&

27、quot;,"JAVA"); /连接 System.out.println("连接后的字符串为:"+s.concat("-your inputed string!"); System.out.println("分割后的字符串为:"); String a=s.split("。"); /以'。'为分隔符分割字符串 for (i=0;i<a.length;i+) System.out.println(ai); 程序运行结果如图3-4所示。图3-4 例3.4 的运行结果3.2 St

28、ringBuffer类和字符串变量在Java中用来实现字符串的另一个类是StringBuffer类,与实现字符串常量的String类不同的是,StringBuffer类的每个对象都是可以扩充和修改的字符串变量,这样有利于减少系统资源的消耗。而且StringBuffer类的对象在多线程执行(multiple threads)的作业中较为安全,其方法在必要时候可以设置成同步(synchronized),不受其他线程的影响。以下是StringBuffer类的构造函数和方法说明。3.2.1 StringBuffer类的构造函数StringBuffer有如下几个构造函数(见表3-3)。表3-3 Stri

29、ngBuffer类的构造函数名 称说 明StringBuffer() 创建一个新的空的StringBuffer类的对象,其容量初值设置成16个字符StringBuffer(int length) 创建一个新的空的StringBuffer类的对象,其容量初值设置成length个字符StringBuffer(String str) 创建一个新的StringBuffer类的对象,其内容为str的内容,容量设置成str长度再加16个字符3.2.2 StringBuffer类的方法表3-4列出了String Buffer类的方法。表3-4 StringBuffer类的方法分类返回类型

30、方 法说 明长度intLength()返回该StringBuffer对象中字符串的长度,注意与StringBuffer对象的容量区别voidsetLength(int newLength) 将StringBuffer对象的字符串长度设定为newLength,如果newLength比原字符串长度小则相当于截取了原字符串前面newLength个字符,如果newLength比原字符串长度大则相当于在原字符串后面添加了(newLength-原长度)个“u0000”字符容量intcapacity() 返回该StringBuffer对象的容量(续)分类返回类型方 法说 明容量voidensure

31、Capacity(int minimumCapacity) 将“minimumCapacity”和“原StringBuffer对象的容量×22”中的较大者设置成新StringBuffer对象的容量,如果minimumCapacity为负数,则该方法不起任何效果扩充StringBufferappend(boolean b) 将布尔类型值b转换成字符串后附加于该StringBuffer对象之后StringBufferappend(char c) 将字符类型值c转换成字符串后附加于该StringBuffer对象之后StringBufferappend(char

32、 str) 将字符数组str转换成字符串后附加于该StringBuffer对象之后StringBufferappend(char str, int offset, int len)将字符数组str从offset位置开始len个字符附加于该StringBuffer对象之后StringBufferappend(String str) 将字符串str附加于该StringBuffer对象之后StringBufferappend(StringBuffer sb) 将StringBuffer对象sb转换成字符串后附加于该StringBuffer对

33、象之后删除StringBufferdelete(int start, int end) 删除原StringBuffer对象中从start字符开始至end字符结束(不含该字符)的字符StringBufferdeleteCharAt(int index) 返回删除原StringBuffer对象第index字符后的新StringBuffer对象查找intindexOf(String str) 返回该StringBuffer对象中第一次出现字符串str的位置intindexOf(String str, int fromIndex)

34、返回该StringBuffer对象中从fromIndex个字符开始第一次出现字符串str的位置intlastIndexOf(String str) 返回该StringBuffer对象由后至前第一次出现字符串str的位置intlastIndexOf(String str, int fromIndex) 返回该StringBuffer对象从fromIndex开始由后至前第一次出现字符串str的位置插入StringBufferinsert (int offset, boolean b) 将布尔类型值b转换成字符串后插入该StringBuff

35、er对象的offset处StringBufferinsert (int offset, char c)将字符类型值c转换成字符串后插入该StringBuffer对象的offset处StringBufferinsert (int offset, char str) 将字符数组str转换成字符串后插入该StringBuffer对象的offset处StringBufferinsert(int index, charstr,int offset, int len) 将字符数组str从offset处开始,len个字符转换成字符串后插入到该Str

36、ingBuffer对象的index处StringBufferinsert(int offset, String str) 将字符串str插入该StringBuffer对象的offset处替换StringBufferreplace(int start, int end, String str) 将原StringBuffer对象中从start字符开始至end字符结束(不含该字符)的所有字符用字符串str替换后返回新生成的StringBuffer对象voidsetCharAt(int index, char ch) 将原StringBuff

37、er对象中第index个字符替换成字符ch。反转StringBufferreverse() 返回原StringBuffer对象内容反转后新的StringBuffer对象转换StringtoString() 将StringBuffer对象转换为String对象提取CharSequencesubSequence(int start, int end) 将原StringBuffer对象中从start字符开始至end字符结束(不含该字符)的字符串转换成CharSequence接口后返回Stringsubstring(int start) 原StringBuffer对象中从

38、start字符开始至结束的字符串转换成String对象后返回Stringsubstring(int start, int end) 原StringBuffer对象中从start字符开始至end字符结束(不含该字符)的字符串转换成String对象后返回charcharAt(int index) 返回该StringBuffer对象内容的第index个字符voidgetChars(int srcBegin,int srcEnd,char dst, int dstBegin) 将该StringBuffer对象从srcBegin字符开

39、始至srcEnd字符结束(不含该字符)的所有字符放到目标字符数组的dstBegin起始位置处上面对StringBuffer类的构造函数和方法进行了介绍,接下来,将利用实例来进一步说明StringBuffer类的使用。例3.5 StringBuffer类方法的应用示例程序 StringTest5.javapublic class StringTest5 public static void main(String args) String s0=args0,s1=args1,s2=args2; /s0,s1,s2保存3个参数 StringBuffer sa=new StringBuffer();

40、 /sa为空,容量为16 StringBuffer sb=new StringBuffer(256);/sb为空,容量为256 StringBuffer sc=new StringBuffer(s2); /sc内容为s2,容量为s2len+16 int i; /s0len,s1len,s2len为三个字符串长度 int s0len=s0.length(),s1len=s1.length(),s2len=s2.length(); System.out.println("sc内容为:"+sc.toString(); System.out.println("sc的字符串

41、长度为:"+sc.length(); System.out.println("sc的容量为:"+sc.capacity(); sc.ensureCapacity(48); /重新设置sc的容量 System.out.println("sc更改后的容量为:"+sc.capacity(); sa.append(s0);/在sa中扩充s0 System.out.println("sa内容为:"+sa.toString(); sb.append(s0+"&"+s1+"&"+s2

42、); /在sa中扩充s0+"&"+s1+"&"+s2 System.out.println("sb内容为:"+sb.toString(); sb.delete(s0len+1,s0len+s1len+1); /删除操作 System.out.println("删除操作后sb的内容为:"+sb.toString(); sb.insert(s0len+1,s1);/插入操作 System.out.println("插入操作后sb的内容为:"+sb.toString(); i=sa.i

43、ndexOf(s2); /在sa中查找字符串s2 if (i<0) /i<0表明没有找到System.out.println("找不到"+s2+",停止执行!");System.exit(1); System.out.println("在sa的第"+i+"位置找到"+s2); sa.replace(i,i+s2len,"live"); /用live替换s2 System.out.println("替换操作后sa的内容为:"+sa.toString(); sa=sa

44、.reverse(); /反转 System.out.println("sa反转后的内容为:"+sa.toString(); s1=sb.substring(s0len+s1len+2,s0len+s1len+s2len+2); /在sb中抽取部分内容 System.out.println("s1的内容更新为:"+s1); char a=new char100; sb.getChars(0,s0len,a,0); /把sb的部分字符序列变成字符数组 System.out.println("a的内容为:"+String.valueOf(

45、a); 设定运行的参数为“ILoveJava YouLoveJava WeLoveJava”程序运行结果如图3-5所示。(a)输入运行参数(b) 运行结果图3-5 例3.5的运行情况3.3 字符串和字符数组在前面三小节讲解了String类、StringBuffer类和StringTokenizer类及其使用方法。在String类和StringBuffer类的构造函数和方法中多次使用到字符数组和字符串,在提供的实例中也不乏这样的例子。由于这两者非常相似,因此有人可能认为字符串就是字符数组,其实在有些编程语言中,比如C语言,其字符串就是由字符数组构成的,每个字符串的结尾用“0”标志,但是在Java

46、中却不是这样的。在Java中,字符串通常是作为String类的对象存在着,如:String s=“I like Java!”,其中“I like Java!”就是一个对象,该对象有许多适用的方法,这个在前面已经讲解过。所以说,Java中的字符串和字符数组是完全不相同的,和C语言中的字符串也是不一样的!为了方便字符串和字符数组的转换,在String类中提供了许多这样的构造函数和方法,如在String类中,其构造函数String(char value)就是将字符数组value创建成一个String对象,而其方法toCharArray() 则是将字符串转换成字符数组,方法valueOf(c

47、har data) 则是将字符数组转换成字符串。3.4 本章小结字符串也是编程中经常用到的数据结构,它是字符的序列,从某种程序上来说有些类似于字符的数组。实际上在有些语言(如C语言)中,字符串是用字符数组来实现的。而在Java这个面向对象的语言中,字符串无论是常量还是变量,都是用类的对象来实现的。程序中需要用到的字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串变量。对于字符串常量,由于程序中经常需要对它做比较、搜索之类的操作,所以通常把它放在一个具有一定名称的对象之中,由程序对该对象完成上述操作;在Java中,存放字符串常

48、量的对象属于String类。对于字符串变量,由于程序中经常需要对它做添加、插入、修改之类的操作,所以一般都存放在StringBuffer类的对象中。除此以外,本章中还重点介绍了字符串和字符数组的区别。习 题 三1Java程序中字符串常量使用什么类来表示?字符串变量又使用什么类来表示?它们主要区别在哪里?2请说明程序String s1="I like "s1+="Java!" 和程序StringBuffer s1=new StringBuffer("I like "); s1.append("Java!"); 的区别

49、。依据你得出的结论,如果程序需要处理大量的字符串连接操作,应该尽量使用String类还是StringBuffer类?3编写一个applet,使之能将定长字符串转化成可变长字符串,并能实现字符串中指定字符的替换。4阅读下面的程序,写出程序运行的结果。import java.util.*;public class StringTestpublic static void main(String arg)String s1="I love Java."String s2="I like Java."String s3="I like Java.&qu

50、ot;StringBuffer s4=new StringBuffer(s1);StringBuffer s5=new StringBuffer("Append");char c1=new chars1.length();System.out.println("s1的长度="+s1.length();System.out.println("s1和s2相同吗? "+(pareTo(s2)=0?"相同":"不同");System.out.println("s2和s3相同吗? "+(pareTo(s3)=0?"相同":"不同");System.out.println("s1连接s2后的字符串为:"+s1.concat(s2);System.out.println(s1.startsWith("J",7);System.out.println(s1.endsWith(

温馨提示

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

评论

0/150

提交评论