C#OOP之十五 String类&StringBuilder类

简介: C#OOP之十五 String类&StringBuilder类

String类的概述


初次看到String这个词,大家应该都很熟悉。有的同学就会想到:它不就是C#中的一个关键字吗?我们已经接触过了啊,它就是一个数据类型而已,能有何大用?也有细心的同学会发现:这个String中的S是大写的,而string中的s是小写。呵呵……不错,“慧眼识英雄”!你想知道此“String”与彼“string”到底存在着什么关系吗?你想知道他们的区别吗?你想了解它们背后的东西吗?那就停下猜疑,我们一起来揭开“String&&string”的神秘面纱。


String类的概述


.NE T Framwork中表示字符串的关键字为string,它是String类的别名。string类型表示Unicode字符的字符串。String类类似于string类型,但是功能更强。虽然String类功能很强,它也是不可改变的,这就是说一旦创建String对象,就不能够修改。表面看来能够修改字符串的所有方法实际上不能够修改。它们实际上返回一个根据所调用的方法修改的新的String。当需要大量的修改时,可使用StringBuilder类。

 

String类的使用

 

String对象是System.Char对象的有序集合,用于表示字符串。String对象的值是该有序集合的内容,并且该值是不可变的。正是字符构成了字符串,根据字符在字符串中的不同位置,字符在字符串中有一个索引值,可以通过索引值获取索引中的某个字符。字符在字符串中的索引从0开始。


例1:创建一个控制台应用程序,声明一个字符串变量,然后获取字符串中的某个字符。


using System;


using System.Collections.Generic;


using System.Text;


namespace Text


{


   classProgram


   {


       staticvoid Main(string[] args)


       {


           stringStr1 = "听过刘若英的歌吗?";


           charStr2 = Str1[1];


           charStr3 = Str1[2];


           Console.WriteLine("字符串Str1中的第二个字符是: {0}", Str2);


           Console.WriteLine("字符串Str1中的第三个字符是: {0}", Str3);


           Console.ReadLine();


       }


   }


}



运行结果:



1.在String类下,最常见的比较字符串的方法有Compare,CompareTo和Equals等方法。


1.Compare方法用于比较两个字符串是否相等,它有很多个重载方法,其中最常用的两种方法如下:


Int compare(string strA,strin strB)


Int compare(string strA,strin strB,bool ignorCase)


批注:strA,strB代表要比较的两个字符串;ignorCase是一个bool类型的参数,如果这个参数的值为True,那么在比较字符串时就忽略大小写的差别。


Compare方法是一个静态方法,所以在使用时,可以直接使用。


例1.1:


     static voidMain(string[]args)


       {


           stringStr1 = "听过刘若英的歌吗?";


           stringStr2 = "知道不知道……讲述一段爱情的故事……?";


           Console.WriteLine(String.Compare(Str1, Str2));


           Console.WriteLine(String.Compare(Str1, Str1));


           Console.WriteLine(String.Compare(Str2, Str1));


           Console.ReadLine();


       }




运行结果:

-1


0


1


注意:比较字符串并非比较字符串长度的大小,而是比较字符串在英文字典中的位置(在英文词典中,排在前面的单词小于后面的单词)。


2.CompareTo方法


CompareTo方法和Compare方法相似,都可以比较两个字符串是否相等,不同的是CompareTo方法以实例对象本身与指定的字符串作比较,语法如下“


Public int CompareTo(string strB)


例1.2:


static void Main(string[] args)


       {


           stringStr1 = "越单纯,越幸福";


           stringStr2 = "一千零一个愿望";


           Console.WriteLine(Str1.CompareTo(Str2));//输出比较后的返回值:如果值相等则返回,如果Str1> Str2则返回,否则返回-1;


           Console.ReadLine();


       }




3.Equals方法


用于比较两个字符串是否相同,如果相同则返回True,否则,返回False


例1.3:


static voidMain(string[]args)


       {


           stringStr1 = "越单纯,越幸福";


           stringStr2 = "一千零一个愿望……";


           Console.WriteLine(Str1.CompareTo(Str2));


           Console.WriteLine(String.Equals(Str1, Str2));


           Console.ReadLine();


          }


运行结果:

1


False


2. 在C#中,String类提供了一个静态的Format方法,用于将字符串数据格式化成指定的格式,语法如下:


Public static stringFormat(string format,object obj);


format:用来指定字符串所要格式化的形式;


obj:要被格式化的对象。


例2.1:


static voidMain(string[]args)


          {


            string Str1 = "越单纯,越幸福";


            string Str2 = "一千零一个愿望";


            string newstr=String.Format("{0},{1}!!!", Str1, Str2);//格式化字符串


            Console.WriteLine(newstr);


            Console.ReadLine();


          }


运行结果:

越单纯,越幸福 一千零一个愿望


在C#中已经提供的用于日期时间的格式规范,具体如下:

格式规范

                    说明

d

简短日期格式(YYYY-MM-dd)

D

    完整日期格式(YYYY年MM月dd日)

t

    简短时间格式(hh:mm)

T

    完整时间格式(hh:mm:ss)

f

    简短日期/时间格式(YYYY年MM月dd日 hh:mm)

F

    完整日期/时间格式(YYYY年MM月dd日 hh:mm:ss)

g

    简短的可排序的日期/时间格式(YYYY-MM-dd hh:mm)

G

    完整的可排序的日期/时间格式(YYYY-MM-dd hh:mm:ss)

M或m

月/日格式(MM月dd日)

Y或y

年/月格式(YYYY年MM月)

例2.2:


   static void Main(string[] args)


          {


            DateTime dt=DateTime.Now;


            string strB=String.Format("{0:D}",dt);//格式化为短日期格式


            Console.WriteLine(strB);


            Console.ReadLine();


          }


运行结果:


2016年4月29日


3.String类的Substring方法,该方法可以截取字符串中指定位置和指定长度的字符。


例2.3:


     static voidMain(string[]args)


       {


           stringStrA="我和你一样的坚强,一样善良";


           stringStrB="";


          StrB=StrA.Substring(1,4);//1:要截取的字符的开始位置索引;:要截取的字符个数。


           Console.WriteLine(StrB);


           Console.ReadLine();


     }


运行结果:

和你一样



4. String类的Split方法,用于分割字符串,此方法的返回值是包含你所有分割字符串的数组对象,可以通过数组取得所有分割的子字符串。


例2.4:


      static voidMain(string[]args)


           {


               string StrA="*@有星星的夜空,真的很美……";


               char[] sep={'@','美'};


               String[] sp=newString[100];


               sp=StrA.Split(sep);


                   for(inti=0;i<sp.Length;i++)


                  {


                    Console.WriteLine("item{0}:{1}",i,sp[i]);


                  }


                  Console.ReadLine();


   }


运行结果:

item0:*


item1:有星星的夜空,真的很


item2:.....



5.String类的Insert方法,用于向字符串的任意位置插入新元素。


例2.5:


using System;


using System.Collections.Generic;


using System.Text;


namespace Text


{


  class Program


  {


       static void Main(string[] args)


       {


           stringStrA="我喜欢";


           stringStrB;


           StrB=StrA.Insert(3,"你...");


          stringStrC = StrB.Insert(7, "喜之郎果冻!!!");


           Console.WriteLine(StrC);


           Console.ReadLine();


       }



  }


}



运行结果:


我喜欢你...喜之郎果冻!!!


6. String类提供了PadLeft/PadRight方法用于填充字符串,PadLeft方法在字符串的左侧进行填充,PadRight则在其右侧。


例2.6:


   static void Main()


   {


       stringstr1 = "*在家号吗???*";


       string str2 =str1.PadLeft(10,'@');


       string str3 = str2.PadRight(11,'#');


       Console.WriteLine("补充字符串之前:" + str1);


       Console.WriteLine("补充字符串之后:" + str3);



7. String类的Remove方法用于从一个字符串的指定位置开始,删除指定数量得字符。语法如下“


Public String Remove(int startIndex)//删除从指定位置开始到最后的所有字符。


Public String Remove(int startIndex,int count)//从指定位置开始删除指定数目的字符


例2.7:


static voidMain()


   {


       stringstr1 = "*ni在家吗???*";


       stringstr2 = str1.Remove(2);


       string str3 =str1.Remove(7, 2);


       Console.WriteLine(str2);


           Console.WriteLine(str3);



      }}运行效果: 结果略


7. String类的Remove方法用于从一个字符串的指定位置开始,删除指定数量得字符。语法如下“


Public String Remove(int startIndex)//删除从指定位置开始到最后的所有字符。


Public String Remove(int startIndex,int count)//从指定位置开始删除指定数目的字符


例2.7:


static voidMain()


   {


       stringstr1 = "*ni在家吗???*";


       stringstr2 = str1.Remove(2);


       string str3 =str1.Remove(7, 2);


       Console.WriteLine(str2);


           Console.WriteLine(str3);



      }




8.String类还提供了Copy和Copyto方法,用于将字符串复制到另一个字符串或Char类的数组中。


例2.8:


static voidMain()


   {


       stringstr1 = "*ni在家吗???*";


       char[]str = new char[100];


       str1.CopyTo(1,str,0,5);//1:要复制的字符的起始位置;str:目标字符数组;0:指定目标数组中的开始存放位置;5:要复制的字符个数      


string str3 = String.Copy(str1);


       Console.WriteLine(str);


       Console.WriteLine(str3);



  }




String 类的利与弊:


String类的对象是不可变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串的对象,这就需要为该新对象分配新的空间。在需要对字符串执行


重复修改时,与创建的String类的对象相关的开销可能会非常昂贵。





StringBuilder类的定义


StringBuilder类有6种不同的构造方法,这里只介绍最常用的一种,当然有兴趣的同学,在课下也可以自己学习其他5的用法,艺多不压身嘛!


其语法格式如下:

public StringBuilder(string value,int n)


! Value: StringBuilder对象引用的字符串。


! n: 设定StringBuilder对象的初始大小。


例:StringBuilder mysb=newStringBuilder(“Hello World!!!”);


//创建一个StringBuilder对象,其初始应用的字符串为“Hello World!!!”





StringBuilder类存在于System.Text命名空间中。


StringBuilder类最常用的几种方法:

方法

说明

Append

将文本或者字符串追加到指定对象的末尾

AppendFormat

自定义变量的格式并将这些值追加到StringBuilder对象的末尾

Insert

将字符串或者对象添加到当前StringBuilder对象中的指定位置

Remove

从当前StringBuilder对象中移除指定数量的自符

Replace

用另一个指定的字符来替换StringBuilder对象内的字符

方法实战:


      创建一个控制台程序,声明一个int类型的变量Num,并初始化为1000,然后创建一个StringBuilder类的对象LS ,其初始值为“书到用时方恨少”,初始大小为100,最后使用上面的5中方法分别对StringBuilder类的对象进行操作。


using System;


using System.Collections.Generic;


using System.Text;


class Progam


{


  static voidMain(string[]args)


  {


       int Num= 100;


       StringBuilder LS = newStringBuilder("书到用时方恨少!", 100);//实例化一个StringBuilder类,并初始化为“书到用时方恨少”!


       LS.Append("&&三味书屋");


       Console.WriteLine(LS);//追加字符串到末尾


      LS.AppendFormat("{0:C}",Num);//将字符串按指定的格式追加到LS的末尾;


       Console.WriteLine(LS);


       LS.Insert(0, "书中自有黄金屋,");//“把书中自有黄金屋,”加到LS的头部;


       Console.WriteLine(LS);


       LS.Remove(10,LS.Length-10);//删除索引值为以后的字符串


       Console.WriteLine(LS);


       LS.Replace("黄金屋", "颜如玉");//把“黄金屋”替换为“颜如玉”;


       Console.WriteLine(LS);


       Console.ReadLine();


  }


}


String类与StringBuffer类的区别:


String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法


使用 StringBuffer 主要就是在性能上的考虑。 String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越的多。不过,一般作为简单的字符串传递和其它操作,只要不改变字符串内容的操作,用 String 效率会高一些。


String类与StringBuilder类的区别:


String的对象是不可变的,每次使用它的方法时,都要在内存中创建一个新的字符串对象,这就需要为新对象分配新的空间。如果你对字符串中的内容需要执行重复修改时,那么系统的开销可能会很昂贵。如果要修改字符串而不创建新的对象,则使用StringBuilder类,尤其是处理大量文字数据时。这样可以提高效率。例如,当在一个循环中将许多字符串连在一起时,使用StringBuilder类可以提升性能。



实践问题:

 

1.下面哪个方法不是Sttring类 的方法?


A.append()                                         B.remove()


C.copy()                                                 D.insert()


2.使用哪种类的哪种方法可以将大写字母转换为小写字母?


3. 描述String类与StringBuilder类的区别?

 



小结:

 

在本章中,我们主要学习了:

u      String类的使用

u      StringBuilder类的简介

u      StringBuilder类的使用

u      String类与StringBuilder类的区别

 



英语词汇:

 

英文             全文                                         中文

Class                            类


Public                               公共的


Static                        静态的


Void                             无返回值的


Main                             主要的(程序入口函数)


String                        字符串


System                        系统


Console                          控制台


Write/WriteLine                      输出/输出且换行


Line                                            行


Append                                         添加


Insert                                         插入


Split                                          分割


Remove                                         移除    


Copy                                           复制


Equals                                         等于


Replace                                        替换


Compare                                       比较


Format                                         格式


Substring                                      截取字符串


Reverse                                        倒置          

练习项目:

 


1. 写一个程序,要求 将字符串中的每个字符点到输出。

2. 写一个程序,实现从字符串中分离文件路径,文件名及扩展名的功能。

3. 在应用程序中实现记事本的菜单栏中”编辑”的复制,粘贴,剪切,删除功能.如果

你有兴趣,也可以把剩余的功能也实现。(可以多个人一组)

目录
相关文章
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
67 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
52 2
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1
|
2月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
64 4
|
2月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
41 5
|
2月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
28 2
|
2月前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
43 0
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
14 0