4[1]2字符串与字符串缓冲区讲稿_第1页
4[1]2字符串与字符串缓冲区讲稿_第2页
4[1]2字符串与字符串缓冲区讲稿_第3页
4[1]2字符串与字符串缓冲区讲稿_第4页
4[1]2字符串与字符串缓冲区讲稿_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、42字符串相和字符串缓冲区1. 字符串:指的是类java. lang. string的实例对象。(包java.lang 提供利用java编程语言进行程序设计的基础类,是可以自动导入 的软件包,不需import语句导入这个包。)java. lang. string的实 例对象一旦创建,则它所包含的字符序列就不能发生变化。2. 字符串缓冲区类 java. lang. stringbuffer与字符串类java. lang. string相似,不过类java. lang. stringbuffer的实例对象所包含的字符序列可以被修 改。可以简写为:string和stringbuffer一x stri

2、ng1构造字符串对象的方法(四种)1) 直接釆用字符串直接常量的方式伽:“abc”,是包含字符'a,、'c,的字符序列。2) 构造字符串实例对象new string (构造方法的调用参数列表);一些常用的构造方法:a) java lang string 的构造方法 public string()java lang string 的构造方法 public string()string si:si二new string(hello there");string sl=new string() ;/sl指向一个空字符串对象string s2=null;/s2不指向任何一个字

3、符串对象b) java.1 ang string 的构造方法 public string(byte bytes) 创建一个字符串对象其中字节数组bytes指定该字符串对象所包含的字符序列c) java. lang. string 的构造方法 public string (char value) 创建一个字符串对象其中字符数组value指定该字符串对象所包含的字符序列d) java lang string 的构造方法 public string (string original)创建一个字符串对象,新创建的字符串对象复制一份与字符串original完全相同的字符序列。这里的original不允许

4、为null。e) java1 ang.string 的构造方法 public string(stringbuffer buffer)创建一个字符串对象,新创建的字符串对象拥有一份与字符串缓冲区buffer相同的字符序列。3) 通过成员方法生成java. lang. string的实例对象在java语言中,任何一种类型的数据都可以转化成字符串类型的数 据。对于基本数据类型的数据,可以功过类java. lang. string的成员方法将相应的数值转换成为字符串。这些成员方法创建新的字符串 对象,它所包含的字符序列对应这些方法参数指定的值:(1) public static string valu

5、eof(boolean b)(2) public static string valueof(char c)(3) public static string valueof(int i)(4) public static string valueof (long 1)(5) public static string valueof(float f)(6) public static string valueof (double d)例如:string sl=string. valueof (true):创建一个包含字符”1、u “、的字符串对象string sl=string valueof(

6、12);创建一个包含字符2"的字符串对象对于引用类型的数据,可以通过类java. lang. string的成员方法public static string valueof(object obj)将参数 obj 指定的数 据转换为字符串。转换的结果生成一个新的字符串对象。如果参数obj为null,则新生成的字符串对象包含字符“nj如果obj的值不是null,则新生成的字符串对象实际上是方法调用"obj. tostring() ”返回的结果。在java语言中,任何一个类都含 有成员方法public string tostringo :该成员方法通常根据当前对象仓【j建一个 对

7、应的字符串对象,并返回该字符串对象的引用值。如果调用该成员 方法的对象是字符串对象,则该成员方法并不创建一个新的字符串对 象,而是直接返回当前对象的引用。4) 通过运算符” +”创建字符串对象string si二” 123” +” 456” ;注意:混用情况string si二” 123” +45+678/sl 与” 12345678” 相同 二、类java. lang. string的成员方法(1) length(),返回 string 的长度如果是字符串的话,求长度只能m. length()方法,不是.length因 为这将被认为是对象的属性,字符串没有 length属性,而数组使用 数组

8、具有length属性,通过它得到数组的长度。(2) char at (int index):获得字符串指定位置的字符例如:用char at (int index)方法和length ()方法在一个字符串中判断一个字符是否存在,若存在则返回其所在位置class mainpublic static void main(string args)string str="abcdefg"/有一个字符串 str下面我们在字串str中寻找字符efor (int i=0; i<str. length() ; i+) /从字符串第一个字符找起, 注意是从0开始算if (str. cha

9、rat(i)=' e')/如果找到字符e,打印出在第几位system, out. println(i);break;else辻(i=str. length ()-1)/如果到最后一位还不存在,打印不存在system, out. print in ( 不存在);(3) getchars():方法,将字符从此字符串复制到目标字符数组。 getchars(int srcbegin, int srcend, char dst, int dstbegin) 要复制的第一个字符在索引srcbegin处;要复制的最后一个字符在 索引srcend-1处(因此要复制的字符总数是srcend-sr

10、cbegin), 要复制到dst子数组的字符从索引dstbegin处开始。例如:class main public static void main(string args)string si;char chararray;sl=new string("hello there");chararray=new char5;sl getchars (0, 5, char ar ray, 0);for (int i=0;ichararray. 1ength;i+)*字符串比较:二二运算符:当用于基本数据类型时,用于判别是否相等当用于引用数据类型时,用来判别引用是否指向相同的对象(

11、stringl=string2):但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false , java中必须使用 stringl. equals (string2)来进行判断(“=是比较两个对象的地址(栈里的内容)” ,stringl. equals(string2)比较两个对象的内容(堆里的内容) 例如:string sl=new string("hello");string s2=new string("hello");(用new创建的si和s2分别引用了两个” hello” string对象)则(sl=s2)=false如果:s

12、tring si二hello"string s2二"hello"(si和s2引用同一个对象“hello” )则(sl=s2)=true;/*对于java程序中的字符直接量,jvm会使用一个字串池来保存它们。当第一次使用某个字符串直接量时,jvm会将它放入字符串池中进行缓存。在一般情况下,字符串池中的字符串对象不会被垃圾回 收。当程序再次需要使用该字符串时,无需重新创建一个新的字符 串就可以直接让引用变量直接指向字符串池中已有的字符串。而使 用new操作创建的字符串对象不指向字符串池中的对象。*/ class main public static void main

13、(string args)string si,s2;boolean t:sl= "hello"s2 = new string( "hello");t=sl = "hello"/ truesystem out printin(t);t二s2 = hello"/falsesystem, out println(t);class main public static void main(string args) boolean t;string si = "asd; string s2 = "asd"

14、t=sl=s2;/*程序运行结果是true, string比较特殊,它一旦初始化了之后, 值就不会再改变了,所以为了节约内存空间,如果初始化的字符串在 内存空间中是存在的,则其引用直接指向该字符串,所以你前面有了 一个string si = asd"当声明s2的时候发现内存中有了一个"asd" 了,就不再开辟内存空间,直接将s2指向了开头得"asd",所以si 和s2实际上是指向了同一块堆内存,所以结果是true*/*字符串(string)比较方法:boolean equals (object anobject)-比较当前的字符串与指定的对象内

15、容是否相同sl equals(s2)比较结果为真o当且仅当给定的参数不为空,并且具有完全相同的 字符序列。例如:public class string5public static void main(string args)string sl=abc", s2二"a b c",s3;s3 = new string( "abc");system. out println(s1. equals(s2);/falseboolean equalsignorecase(string anotherstring)判别相等,但不区分大小写例如:在不区分大小写

16、情况下,“hello”与“hello”相等public class string6public static void main(string args)string si二"abc", s2二"a b c",s3;s3 = new string ( "abc");system outprintln(s1. equalsignorecase(s2);/falsesystem out printin(s1. equalsignorecase(s3);/true int compareto(string anotherstring)-比较

17、两个字符串的内容-返回: 0 :如果字符串内容完全相同;小于0的值:如果在比较第一个不相同字符,当前 字符串的字符的值小于anotherstring对应的字符的值;大于0的值:如果在比较第一个不相同字符,当前字符串的字符的值大于anotherstring对应的字符 的值。例如:public class string7public static void main(string args)strings2二abe", s3二bed"string s4=new string("abc");system out. println(s1. compareto(s

18、2)>0);/truesystem outprintin(s1. compareto(s3)<0);/truesystem out println(s1. compareto(s4)=0):/true int comparetoignorecase(string str)-比较两个字符串的内容,但不区分大小写 査找字符串中的字符或子串查找字符串(string)中的字符或子串-方法 indexof ()返回第一次找到的时下标如果没有找到,则返回-1四种重载方法indexof(1) name. indexof ("oo)查找字符串(string)中的子串public clas

19、s string8public static void main(string args)string name = "cooltools"system, out. printin (name. indexof ("oo") ;/ 返回第一次找到的时下标1system, out. printin (name. indexof ("to", 2);/这个函数的用法是查找字符串中的字符to从第3个开始查找,返回所在字符的索 引4(2) str.indexof(s1,index):这个函数的用法是査找字符串中的字符s1从第index个开始査

20、找, 返回所在字符的索引。name indexof("to", 2)(3) 方法 lastlndexof (substring):返回string对象中子字符串最后出现的位置。 例如:public class string9public static void main(string args)string name = "cooltools”;system.out.println (name.lastlndexof(hooh);返回string对象中子字符串最大出现的位置5system.out.println (name.lastlndexof(vvoov4);

21、/从指定位置往回查找,返回string对象中子字符串最大出现的位置1(4) name.lastlndexof(hoov4) 从指定位置往回查找,返回string对象中子字符串最大出现的位置1*从当前字符串中抽取子字符串:方法 subs tring一 substring(int beginlndex)返回新的字符串:当前字符串的子串该子串从指定的位置开始,并一直到当前字符串结 束为止例如:public class stringlopublic static void main(string args)string name = "cooltools"system, out.

22、printin (name, substring(2) ;/返回新的字符串:当 前字符串的子串,该子串从指定的位置开始,并一直到当前字符串结 束为止” oltools”system, out. println (name, substring(2, 6) ;/该子串从指定的位置(beginlndex )开始,到指定的位置(endindex - 1)结束” olto”substring (int beginlndex, int endindex)返回新的字符串:当前字符串的子串,该子串从指定的位置(beginlndex )开始,到指定的位置(endindex - 1)结束*字符串(string)

23、拼接:方法 concat-拼接两个字符串,并返回一个新字符串 -源字符串不会被修改一 si.concat( s2 )返回字符串si和s2拼接的结果示例:public class stringllpublic static void main(string args)string namel = "cooltools", name2二"abc"system. out printin(namel. concat (name2) ;/拼接两个字符串,并返回一个新字符串cooltoolsabc*类string的成员方法valueof:public static

24、string valueof()他是一个静态方法参数里可以放boolean int char long float double等这些基本类型返回这些类型的字符串表示形式比如:string.valueof(true)返回"true"将参数的值转化成相应的字符串例如:public class stringl2public static void main(string args)string s=new string ();system out. println(svalueof(true);/truesystem, out println(s valueof (1) ;/l

25、system out println(s valueof(2l);/2system out println(s valueof(2 6);/2.6对象还可以通过方法tostring转化成字符串 “所有对象都有这个方法s因为它是object里面已经有了的方法, 而所有类都是继承object,所以“所有对象都有这个方法覽它通常 只是为了方便输出,比如system.out.println(xx),括号里面的“xx"如果不是string类型的话,就自动调用xx的tostring()方法system.out.println():是将输出各种类型的变量以字符串的形式打印出来。*其它string方

26、法:slreplace( charl, char2 )返回一个新的字符串,它是将si中的所有charl 替换成char2;如果si不含charl,则返回原字符串的引用,即 si.示例:public class stringl3public static void main(string args)string s二"123456"system .out. println(sreplace( "456", abc );/123abc sltouppercase 0 :-返回对应的新字符串,各个字母都是大写的-如果没有字符被修改,则返回原字符串的引用例如:p

27、ublic class stringl3public static void main(string args)string s=12abcde"system, out. println(s. touppercase () ;/12abcde sl trim()string的trim ()方法返回的是原字符串截去前后空串后的一个'噺啲字符串对象,而不是原来的对象,也就是说他们在内存中的存 储地址是不一样的。如果字符串没有被改变,则返回原字符串的引用例如:public class stringl4public static void main(string args)strin

28、g s二 12abcde “;system outprintln(s trim();/12abcde sltochararray()将字符串转换成字符数组public class stringl5public static void main(string args)string si二12abcde;char s2=s 1. tochararray ();for (int i=0;i<s2.1ength;i+)system out print(s2i);/12abcde方法 intern ()public string intern。返回字符串对象的规范化表示形式。一个初 始为空的字符

29、串池,它由类string私有地维护。当调用intern方 法时,如果池已经包含一个等于此string对象的字符串,则返回池 中的字符串。否则,将此string对象添加到池中,并返回此string 对象的引用。例如:public class stringl6public static void main(string args)string si二abcde",s2, s3二"xyz"s2=sl. intern() ;/当调用intern方法时,如果池已经包含一个等 于此string对象的字符串,则返回池中的字符串。system, out. print (s2);/

30、输出 abcdesystem out. println();system out .print in (s 1. intern () = s3 intern ():/false;system, outprintln(s 1. intern() = s2 intern() ;/true 字符串对象是一种特殊的对象,string类是一个不可变的类,也就 说,string对象一旦创建就不允许修改。string类有一个对应的 string池,也就是string pool,每一个内容相同的字符串对象都对 应于一个pool里的对象。看下面一段代码:string s 二 new string ( “abc”

31、 );string si = “abc” ;string s2 = new string( “abc” );system .out. println(s 二二 si);systemout. println(s 二二 s2);system .out. println(sl = s2);请问前面三条语句分别创建了几个对象,分别是什么?后面的输出分 别是什么?(1) string s = new string( "abc”);这句,创建了两个对象,其内 容都是” abc” , s是指向对象的引用。创建的流程是,首先括号里 的” abc"先到string pool里看有没” abc

32、"这个对象,没有则在 pool里创建这个对象。所以这里就在pool创建了一个” abc”对象。 然后通过new语句又创建了一个” abc"对象。而这个对象是放在内 存的堆里,这里的s指向堆里的对象。(2) string si = “abc” ;这条语句,si当然还是引用,即 在pool 里查找有没” abc"这个对象,没有则创建一个很显然,第一条语句 在pool里已经创建了一个v abcv o所以这条语句没有创建对象,si 指向的是pool中的” abc” o(3) string s2 = new string ( "abc”);这条语句,其实和第一条是

33、 一样的,但是,因为第一条已经在pool中创建了” abc"这个对象,所 以,这条语句创建了一个对象。s2指向的是堆里的” abc" o注意,虽 然内容都是” abc" , s与s2指向的是不同的对象。(4) 三个二二判断。(注意严二永远是判断内存地址是否相等)s与si, 一个指向堆里的对象,一个指向pool里的。很明显是不同的对象。s 与s2虽然都是指向堆里的对象,内容也是” abc”,但是也不是相同 的对象。si与s2 个指向pool, 一个指向堆,也不是相同的对象, 所以三个都返回false.2第二个问题string s 二 new string( “abc

34、” );string si = "abc"string s2 二 new string( “abc” );system .out. printl n(s 二二 si. in tern();system out. println(s 二二 s2 intcrno);system .out. printl n(sl = s2 inter n();求最后输岀是什么解答:最后的答案是false false trueintern ()方法:按照jdk的帮助文档来说,是返回字符串对象的规范 化表示形式。通俗一点说,就是返回对应这个字符串内容的那个pool 里的对象。例:s1. inter

35、no :执行流程是,在pool里去查找s1对应的内容,如果 找到,则返回pool里的对象,如果没有,则在pool创建这个对象。二、字符串缓冲区:类stringbuffer类 string-字符串(string)对象一旦创建,其内容不能再被修改(read-only)例如:public class stringl7public static void main(string args)string si二"abede"string s2=new string (si);stringbuffer b = new stringbuffer("hello");sy

36、stem, out. print in (b. length ();/输出字符串缓冲区的长度 5syste in. out print in (b) ; /hellob = new stringbuffer("xyz");system, out. print in (b. length ();/输出字符串缓冲区的长度 3system out println(b) ;/xyzsystem, out. println(b. capacity () ;/capacity ()返回的是字符串缓冲区的容量,stringbuffer ()分配16个字符的缓冲区,又 stringbuff

37、er b用字符构造的 xyz的长度是3,所以一共是19。 b. setlength(80);/设置缓冲区长度值为80system, out. println(b. capacity ();输出 80注意:java. lang. string的实例对象一旦创建,则它所包含的字符 序列就不能发生变化。而java. lang. stringbuffer的实例对象所包 含的字符序列可以被修改。可以简写为:string和stringbuffer:stringstr二aaa ;str =str+"bbb “;str =str+ ccc ;str =str+"ddd这个时候内存(堆)里存

38、放着aaa "、z,aaabbb ", "aaabbbccc ""aaabbbcccddd “;stringbuffer sb = new stringbuffer ( aaa “);sb.append( "bbb ”);sb.append( "ccc ”);sb.append( ddd ”);这个时候内存(堆)里只存放着最终的结果:"aaabbbcccddd "。 就耗掉的内存来说stringbuffer小多了。所以当字符串经常变化时 推荐使用。类stringbuffer:- stringbuffer对

39、象的内容是可以被修改的-除了字符的长度之外,还有容量的概念-通过动态改变容量的大小,加速字符管理*三种stringbuffer构造方法: bufl = new stringbuffer ():-创建空的stringbuffer对象-容量为16字符 buf2 = new stringbuffer( capacity );-创建空的stringbuffer对象-指定容量大小 buf3 = new stringbuffer( mystring );-创建含有相应字符序列的stringbuffer对象-容量为mystringlength() + 16示例:stringbuffer b = new st

40、ringbuffer("hello"); string和stringbuffer是两种不同的类-不能用字符串(string)的实例对象调用类(stringbuffer)的成员方法,反之亦然stringbuffer :方法 length()返回stringbuffer的长度方法 capacity ()返回stringbuffer的容量方法 setlength(int newlength)例如:上例中b. setlength(80):system, out. println(b. capacity () ;/输出 80 处理stringbuffer内字符的方法:方法 char

41、at (int index)返回stringbuffer对象中指定位置的字符例如:public class stringl8 public static void main(string args)stringbuffer b = new stringbuffer("hello");system, out. println(b. charat(l) ;/输出 stringbuffer 对象中 指定位置的字符e方法 setcharat (int index, char ch)-设置stringbuffer对象中指定位置的字符public class stringl8publi

42、c static void main(string args)stringbuffer b = new stringbuffer("hello");system, out. println(b. charat(l) ;/输出 stringbuffer 对象中 指定位置的字符eb. setcharat (1, 'e');/设置 stringbuffer 对象 b 中指定位置的字 符system, out. printin(b);/hello方法 getchars (int srcbegin, int srcend,chart dst, int dstbegin

43、)-将stringbuffer对象中指定的字符子序列,拷贝到指定 的字符数组(dst)例如:public class stringl9public static void main(string args)char c二new char 5;stringbuffer b = new stringbuffer("hello");b. getchars (0, 5, c, 0);将 stringbuffer 对象b 中指定的字符子序列,拷贝到指定的字符数组(dst)for (int i=0;i<c1ength;i+)system, out. print (ci);/对数组

44、进行输出方法 reverse ()-将stringbuffer对象中的字符序列按逆序方式排列例如:public static void main(string args)stringbuffer b = new stringbuffer(hello);b. reverse (); 将stringbuffer对象b中指定的字符子序列逆序存system, out. print (b) ;/缓冲区新内容输出 ollehappend ()方法:允许数值类型的值添加到stringbuffer对象中示例:public class string21public static void main(string

45、 args)stringbuffer b = new stringbuffer("hello");bappendok");system, out. print (b);输出 hello ok又:buf. append (astring, 3, 4);这个操作将astring的从索引位置3开始的由四个字符组成的子串追加到stringbuffer对象buf中。insert 和 delete 方法:方法 insert-允许将各种数据插到stringbuffer对象的指定位置例如:public class string22public static void main(string args

温馨提示

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

评论

0/150

提交评论